diff --git a/agents/dmtagent_it_test.go b/agents/dmtagent_it_test.go index 7ace75444..fd409ca33 100644 --- a/agents/dmtagent_it_test.go +++ b/agents/dmtagent_it_test.go @@ -137,7 +137,7 @@ func TestDmtAgentCCRAsSMGenericEvent(t *testing.T) { if ccr.diamMessage, err = ccr.AsDiameterMessage(); err != nil { t.Error(err) } - eSMGE := sessionmanager.SMGenericEvent{"EventName": "DIAMETER_CCR", "AccId": "routinga;1442095190;1476802709", + eSMGE := sessionmanager.SMGenericEvent{"EventName": "DIAMETER_CCR", "OriginID": "routinga;1442095190;1476802709", "Account": "*users", "AnswerTime": "2015-11-23 12:22:24 +0000 UTC", "Category": "call", "Destination": "4986517174964", "Direction": "*out", "ReqType": "*users", "SetupTime": "2015-11-23 12:22:24 +0000 UTC", "Subject": "*users", "SubscriberId": "4986517174963", "TOR": "*voice", "Tenant": "*users", "Usage": "300"} @@ -183,11 +183,11 @@ func TestDmtAgentSendCCRInit(t *testing.T) { if err != nil { t.Fatal(err) } - cdr := &engine.StoredCdr{CgrId: utils.Sha1("dsafdsaf", time.Date(2015, 11, 7, 8, 42, 20, 0, time.UTC).String()), OrderId: 123, TOR: utils.VOICE, - AccId: "dsafdsaf", CdrHost: "192.168.1.1", CdrSource: utils.UNIT_TEST, ReqType: utils.META_RATED, Direction: "*out", + cdr := &engine.CDR{CGRID: utils.Sha1("dsafdsaf", time.Date(2015, 11, 7, 8, 42, 20, 0, time.UTC).String()), OrderID: 123, TOR: utils.VOICE, + OriginID: "dsafdsaf", OriginHost: "192.168.1.1", Source: utils.UNIT_TEST, ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1004", Supplier: "SUPPL1", - SetupTime: time.Date(2015, 11, 7, 8, 42, 20, 0, time.UTC), AnswerTime: time.Date(2015, 11, 7, 8, 42, 26, 0, time.UTC), MediationRunId: utils.DEFAULT_RUNID, - Usage: time.Duration(0) * time.Second, Pdd: time.Duration(7) * time.Second, ExtraFields: map[string]string{"Service-Context-Id": "voice@huawei.com"}, + SetupTime: time.Date(2015, 11, 7, 8, 42, 20, 0, time.UTC), AnswerTime: time.Date(2015, 11, 7, 8, 42, 26, 0, time.UTC), RunID: utils.DEFAULT_RUNID, + Usage: time.Duration(0) * time.Second, PDD: time.Duration(7) * time.Second, ExtraFields: map[string]string{"Service-Context-Id": "voice@huawei.com"}, } ccr := storedCdrToCCR(cdr, "UNIT_TEST", daCfg.DiameterAgentCfg().OriginRealm, daCfg.DiameterAgentCfg().VendorId, daCfg.DiameterAgentCfg().ProductName, utils.DIAMETER_FIRMWARE_REVISION, daCfg.DiameterAgentCfg().DebitInterval, false) @@ -214,11 +214,11 @@ func TestDmtAgentSendCCRUpdate(t *testing.T) { if !*testIntegration { return } - cdr := &engine.StoredCdr{CgrId: utils.Sha1("dsafdsaf", time.Date(2015, 11, 7, 8, 42, 20, 0, time.UTC).String()), OrderId: 123, TOR: utils.VOICE, - AccId: "dsafdsaf", CdrHost: "192.168.1.1", CdrSource: utils.UNIT_TEST, ReqType: utils.META_RATED, Direction: "*out", + cdr := &engine.CDR{CGRID: utils.Sha1("dsafdsaf", time.Date(2015, 11, 7, 8, 42, 20, 0, time.UTC).String()), OrderID: 123, TOR: utils.VOICE, + OriginID: "dsafdsaf", OriginHost: "192.168.1.1", Source: utils.UNIT_TEST, ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1004", Supplier: "SUPPL1", - SetupTime: time.Date(2015, 11, 7, 8, 42, 20, 0, time.UTC), AnswerTime: time.Date(2015, 11, 7, 8, 42, 26, 0, time.UTC), MediationRunId: utils.DEFAULT_RUNID, - Usage: time.Duration(300) * time.Second, Pdd: time.Duration(7) * time.Second, ExtraFields: map[string]string{"Service-Context-Id": "voice@huawei.com"}, + SetupTime: time.Date(2015, 11, 7, 8, 42, 20, 0, time.UTC), AnswerTime: time.Date(2015, 11, 7, 8, 42, 26, 0, time.UTC), RunID: utils.DEFAULT_RUNID, + Usage: time.Duration(300) * time.Second, PDD: time.Duration(7) * time.Second, ExtraFields: map[string]string{"Service-Context-Id": "voice@huawei.com"}, } ccr := storedCdrToCCR(cdr, "UNIT_TEST", daCfg.DiameterAgentCfg().OriginRealm, daCfg.DiameterAgentCfg().VendorId, daCfg.DiameterAgentCfg().ProductName, utils.DIAMETER_FIRMWARE_REVISION, daCfg.DiameterAgentCfg().DebitInterval, false) @@ -245,11 +245,11 @@ func TestDmtAgentSendCCRUpdate2(t *testing.T) { if !*testIntegration { return } - cdr := &engine.StoredCdr{CgrId: utils.Sha1("dsafdsaf", time.Date(2015, 11, 7, 8, 42, 20, 0, time.UTC).String()), OrderId: 123, TOR: utils.VOICE, - AccId: "dsafdsaf", CdrHost: "192.168.1.1", CdrSource: utils.UNIT_TEST, ReqType: utils.META_RATED, Direction: "*out", + cdr := &engine.CDR{CGRID: utils.Sha1("dsafdsaf", time.Date(2015, 11, 7, 8, 42, 20, 0, time.UTC).String()), OrderID: 123, TOR: utils.VOICE, + OriginID: "dsafdsaf", OriginHost: "192.168.1.1", Source: utils.UNIT_TEST, ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1004", Supplier: "SUPPL1", - SetupTime: time.Date(2015, 11, 7, 8, 42, 20, 0, time.UTC), AnswerTime: time.Date(2015, 11, 7, 8, 42, 26, 0, time.UTC), MediationRunId: utils.DEFAULT_RUNID, - Usage: time.Duration(600) * time.Second, Pdd: time.Duration(7) * time.Second, ExtraFields: map[string]string{"Service-Context-Id": "voice@huawei.com"}, + SetupTime: time.Date(2015, 11, 7, 8, 42, 20, 0, time.UTC), AnswerTime: time.Date(2015, 11, 7, 8, 42, 26, 0, time.UTC), RunID: utils.DEFAULT_RUNID, + Usage: time.Duration(600) * time.Second, PDD: time.Duration(7) * time.Second, ExtraFields: map[string]string{"Service-Context-Id": "voice@huawei.com"}, } ccr := storedCdrToCCR(cdr, "UNIT_TEST", daCfg.DiameterAgentCfg().OriginRealm, daCfg.DiameterAgentCfg().VendorId, daCfg.DiameterAgentCfg().ProductName, utils.DIAMETER_FIRMWARE_REVISION, daCfg.DiameterAgentCfg().DebitInterval, false) @@ -275,11 +275,11 @@ func TestDmtAgentSendCCRTerminate(t *testing.T) { if !*testIntegration { return } - cdr := &engine.StoredCdr{CgrId: utils.Sha1("dsafdsaf", time.Date(2015, 11, 7, 8, 42, 20, 0, time.UTC).String()), OrderId: 123, TOR: utils.VOICE, - AccId: "dsafdsaf", CdrHost: "192.168.1.1", CdrSource: utils.UNIT_TEST, ReqType: utils.META_RATED, Direction: "*out", + cdr := &engine.CDR{CGRID: utils.Sha1("dsafdsaf", time.Date(2015, 11, 7, 8, 42, 20, 0, time.UTC).String()), OrderID: 123, TOR: utils.VOICE, + OriginID: "dsafdsaf", OriginHost: "192.168.1.1", Source: utils.UNIT_TEST, ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1004", Supplier: "SUPPL1", - SetupTime: time.Date(2015, 11, 7, 8, 42, 20, 0, time.UTC), AnswerTime: time.Date(2015, 11, 7, 8, 42, 26, 0, time.UTC), MediationRunId: utils.DEFAULT_RUNID, - Usage: time.Duration(610) * time.Second, Pdd: time.Duration(7) * time.Second, ExtraFields: map[string]string{"Service-Context-Id": "voice@huawei.com"}, + SetupTime: time.Date(2015, 11, 7, 8, 42, 20, 0, time.UTC), AnswerTime: time.Date(2015, 11, 7, 8, 42, 26, 0, time.UTC), RunID: utils.DEFAULT_RUNID, + Usage: time.Duration(610) * time.Second, PDD: time.Duration(7) * time.Second, ExtraFields: map[string]string{"Service-Context-Id": "voice@huawei.com"}, } ccr := storedCdrToCCR(cdr, "UNIT_TEST", daCfg.DiameterAgentCfg().OriginRealm, daCfg.DiameterAgentCfg().VendorId, daCfg.DiameterAgentCfg().ProductName, utils.DIAMETER_FIRMWARE_REVISION, daCfg.DiameterAgentCfg().DebitInterval, true) @@ -305,8 +305,8 @@ func TestDmtAgentCdrs(t *testing.T) { if !*testIntegration { return } - var cdrs []*engine.ExternalCdr - req := utils.RpcCdrsFilter{RunIds: []string{utils.META_DEFAULT}} + var cdrs []*engine.ExternalCDR + req := utils.RPCCDRsFilter{RunIDs: []string{utils.META_DEFAULT}} if err := apierRpc.Call("ApierV2.GetCdrs", req, &cdrs); err != nil { t.Error("Unexpected error: ", err.Error()) } else if len(cdrs) != 1 { diff --git a/agents/libdmt.go b/agents/libdmt.go index d9cee6265..e349fe95c 100644 --- a/agents/libdmt.go +++ b/agents/libdmt.go @@ -118,11 +118,11 @@ func usageFromCCR(reqType, reqNr, ccTime int, debitIterval time.Duration) time.D } // Utility function to convert from StoredCdr to CCR struct -func storedCdrToCCR(cdr *engine.StoredCdr, originHost, originRealm string, vendorId int, productName string, +func storedCdrToCCR(cdr *engine.CDR, originHost, originRealm string, vendorId int, productName string, firmwareRev int, debitInterval time.Duration, callEnded bool) *CCR { //sid := "session;" + strconv.Itoa(int(rand.Uint32())) reqType, reqNr, ccTime := disectUsageForCCR(cdr.Usage, debitInterval, callEnded) - ccr := &CCR{SessionId: cdr.CgrId, OriginHost: originHost, OriginRealm: originRealm, DestinationHost: originHost, DestinationRealm: originRealm, + ccr := &CCR{SessionId: cdr.CGRID, OriginHost: originHost, OriginRealm: originRealm, DestinationHost: originHost, DestinationRealm: originRealm, AuthApplicationId: 4, ServiceContextId: cdr.ExtraFields["Service-Context-Id"], CCRequestType: reqType, CCRequestNumber: reqNr, EventTimestamp: cdr.AnswerTime, ServiceIdentifier: 0} ccr.SubscriptionId = make([]struct { @@ -139,7 +139,7 @@ func storedCdrToCCR(cdr *engine.StoredCdr, originHost, originRealm string, vendo ccr.ServiceInformation.INInformation.CallingVlrNumber = cdr.ExtraFields["Calling-Vlr-Number"] ccr.ServiceInformation.INInformation.CallingCellIDOrSAI = cdr.ExtraFields["Calling-CellID-Or-SAI"] ccr.ServiceInformation.INInformation.BearerCapability = cdr.ExtraFields["Bearer-Capability"] - ccr.ServiceInformation.INInformation.CallReferenceNumber = cdr.CgrId + ccr.ServiceInformation.INInformation.CallReferenceNumber = cdr.CGRID ccr.ServiceInformation.INInformation.TimeZone = 0 ccr.ServiceInformation.INInformation.SSPTime = cdr.ExtraFields["SSP-Time"] return ccr diff --git a/apier/v1/apier_local_test.go b/apier/v1/apier_local_test.go index 10ed9ec9d..e0ce0a26a 100644 --- a/apier/v1/apier_local_test.go +++ b/apier/v1/apier_local_test.go @@ -79,7 +79,7 @@ func TestApierCreateDirs(t *testing.T) { if !*testLocal { return } - for _, pathDir := range []string{cfg.CdreProfiles[utils.META_DEFAULT].ExportDir, "/var/log/cgrates/cdrc/in", "/var/log/cgrates/cdrc/out", cfg.HistoryDir} { + for _, pathDir := range []string{cfg.CdreProfiles[utils.META_DEFAULT].ExportFolder, "/var/log/cgrates/cdrc/in", "/var/log/cgrates/cdrc/out", cfg.HistoryDir} { if err := os.RemoveAll(pathDir); err != nil { t.Fatal("Error removing folder: ", pathDir, err) @@ -255,10 +255,10 @@ func TestApierTPDestination(t *testing.T) { // Test getIds var rplyDstIds []string expectedDstIds := []string{"FS_USERS", "GERMANY", "GERMANY_MOBILE"} - if err := rater.Call("ApierV1.GetTPDestinationIds", AttrGetTPDestinationIds{TPid: dstDe.TPid}, &rplyDstIds); err != nil { - t.Error("Calling ApierV1.GetTPDestinationIds, got error: ", err.Error()) + if err := rater.Call("ApierV1.GetTPDestinationIDs", AttrGetTPDestinationIds{TPid: dstDe.TPid}, &rplyDstIds); err != nil { + t.Error("Calling ApierV1.GetTPDestinationIDs, got error: ", err.Error()) } else if !reflect.DeepEqual(expectedDstIds, rplyDstIds) { - t.Errorf("Calling ApierV1.GetTPDestinationIds expected: %v, received: %v", expectedDstIds, rplyDstIds) + t.Errorf("Calling ApierV1.GetTPDestinationIDs expected: %v, received: %v", expectedDstIds, rplyDstIds) } } @@ -312,7 +312,7 @@ func TestApierTPRate(t *testing.T) { if err := rater.Call("ApierV1.GetTPRateIds", AttrGetTPRateIds{rt.TPid, utils.Paginator{}}, &rplyRtIds); err != nil { t.Error("Calling ApierV1.GetTPRateIds, got error: ", err.Error()) } else if !reflect.DeepEqual(expectedRtIds, rplyRtIds) { - t.Errorf("Calling ApierV1.GetTPDestinationIds expected: %v, received: %v", expectedRtIds, rplyRtIds) + t.Errorf("Calling ApierV1.GetTPDestinationIDs expected: %v, received: %v", expectedRtIds, rplyRtIds) } } @@ -1382,7 +1382,7 @@ func TestApierExportCdrsToFile(t *testing.T) { req.CdrFormat = &dryRun tm1, _ := utils.ParseTimeDetectLayout("2013-11-07T08:42:22Z") tm2, _ := utils.ParseTimeDetectLayout("2013-11-07T08:42:23Z") - expectReply := &utils.ExportedFileCdrs{ExportedFilePath: utils.CDRE_DRYRUN, TotalRecords: 2, ExportedCgrIds: []string{utils.Sha1("dsafdsaf", tm1.String()), + expectReply := &utils.ExportedFileCdrs{ExportedFilePath: utils.CDRE_DRYRUN, TotalRecords: 2, ExportedCGRIDs: []string{utils.Sha1("dsafdsaf", tm1.String()), utils.Sha1("adsafdsaf", tm2.String())}} if err := rater.Call("ApierV1.ExportCdrsToFile", req, &reply); err != nil { t.Error(err.Error()) @@ -1410,7 +1410,7 @@ func TestApierLocalGetCdrs(t *testing.T) { if !*testLocal { return } - var reply []*engine.ExternalCdr + var reply []*engine.ExternalCDR req := utils.AttrGetCdrs{} if err := rater.Call("ApierV1.GetCdrs", req, &reply); err != nil { t.Error("Unexpected error: ", err.Error()) @@ -1424,17 +1424,18 @@ func TestApierLocalProcessCdr(t *testing.T) { return } var reply string - cdr := engine.StoredCdr{CgrId: utils.Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderId: 123, TOR: utils.VOICE, AccId: "dsafdsaf", - CdrHost: "192.168.1.1", CdrSource: "test", ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002", - SetupTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), MediationRunId: utils.DEFAULT_RUNID, - Usage: time.Duration(10) * time.Second, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, RatedAccount: "dan", RatedSubject: "dans", + cdr := engine.CDR{CGRID: utils.Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderID: 123, TOR: utils.VOICE, OriginID: "dsafdsaf", + OriginHost: "192.168.1.1", Source: "test", ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", + Destination: "1002", + SetupTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), RunID: utils.DEFAULT_RUNID, + Usage: time.Duration(10) * time.Second, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, } if err := rater.Call("CdrsV1.ProcessCdr", cdr, &reply); err != nil { t.Error("Unexpected error: ", err.Error()) } else if reply != utils.OK { t.Error("Unexpected reply received: ", reply) } - var cdrs []*engine.ExternalCdr + var cdrs []*engine.ExternalCDR req := utils.AttrGetCdrs{} if err := rater.Call("ApierV1.GetCdrs", req, &cdrs); err != nil { t.Error("Unexpected error: ", err.Error()) @@ -1448,9 +1449,9 @@ func TestApierLocalSetDC(t *testing.T) { return } dcs1 := []*utils.DerivedCharger{ - &utils.DerivedCharger{RunId: "extra1", ReqTypeField: "^prepaid", DirectionField: "*default", TenantField: "*default", CategoryField: "*default", + &utils.DerivedCharger{RunID: "extra1", ReqTypeField: "^prepaid", DirectionField: "*default", TenantField: "*default", CategoryField: "*default", AccountField: "rif", SubjectField: "rif", DestinationField: "*default", SetupTimeField: "*default", AnswerTimeField: "*default", UsageField: "*default"}, - &utils.DerivedCharger{RunId: "extra2", ReqTypeField: "*default", DirectionField: "*default", TenantField: "*default", CategoryField: "*default", + &utils.DerivedCharger{RunID: "extra2", ReqTypeField: "*default", DirectionField: "*default", TenantField: "*default", CategoryField: "*default", AccountField: "ivo", SubjectField: "ivo", DestinationField: "*default", SetupTimeField: "*default", AnswerTimeField: "*default", UsageField: "*default"}, } attrs := AttrSetDerivedChargers{Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "dan", Subject: "dan", DerivedChargers: dcs1, Overwrite: true} @@ -1467,11 +1468,11 @@ func TestApierLocalGetDC(t *testing.T) { return } attrs := utils.AttrDerivedChargers{Tenant: "cgrates.org", Category: "call", Direction: "*out", Account: "dan", Subject: "dan"} - eDcs := utils.DerivedChargers{DestinationIds: utils.NewStringMap(), + eDcs := utils.DerivedChargers{DestinationIDs: utils.NewStringMap(), Chargers: []*utils.DerivedCharger{ - &utils.DerivedCharger{RunId: "extra1", ReqTypeField: "^prepaid", DirectionField: "*default", TenantField: "*default", CategoryField: "*default", + &utils.DerivedCharger{RunID: "extra1", ReqTypeField: "^prepaid", DirectionField: "*default", TenantField: "*default", CategoryField: "*default", AccountField: "rif", SubjectField: "rif", DestinationField: "*default", SetupTimeField: "*default", AnswerTimeField: "*default", UsageField: "*default"}, - &utils.DerivedCharger{RunId: "extra2", ReqTypeField: "*default", DirectionField: "*default", TenantField: "*default", CategoryField: "*default", + &utils.DerivedCharger{RunID: "extra2", ReqTypeField: "*default", DirectionField: "*default", TenantField: "*default", CategoryField: "*default", AccountField: "ivo", SubjectField: "ivo", DestinationField: "*default", SetupTimeField: "*default", AnswerTimeField: "*default", UsageField: "*default"}, }} var dcs utils.DerivedChargers diff --git a/apier/v1/cdre.go b/apier/v1/cdre.go index 7335f4b28..0079a7ddc 100644 --- a/apier/v1/cdre.go +++ b/apier/v1/cdre.go @@ -120,7 +120,7 @@ func (self *ApierV1) ExportCdrsToFile(attr utils.AttrExpFileCdrs, reply *utils.E return fmt.Errorf("%s:FieldSeparator:%s", utils.ErrServerError.Error(), "Invalid") } } - exportDir := exportTemplate.ExportDir + exportDir := exportTemplate.ExportFolder if attr.ExportDir != nil && len(*attr.ExportDir) != 0 { exportDir = *attr.ExportDir } @@ -140,7 +140,7 @@ func (self *ApierV1) ExportCdrsToFile(attr utils.AttrExpFileCdrs, reply *utils.E if attr.DataUsageMultiplyFactor != nil && *attr.DataUsageMultiplyFactor != 0.0 { dataUsageMultiplyFactor = *attr.DataUsageMultiplyFactor } - smsUsageMultiplyFactor := exportTemplate.SmsUsageMultiplyFactor + smsUsageMultiplyFactor := exportTemplate.SMSUsageMultiplyFactor if attr.SmsUsageMultiplyFactor != nil && *attr.SmsUsageMultiplyFactor != 0.0 { smsUsageMultiplyFactor = *attr.SmsUsageMultiplyFactor } @@ -160,7 +160,7 @@ func (self *ApierV1) ExportCdrsToFile(attr utils.AttrExpFileCdrs, reply *utils.E if attr.RoundDecimals != nil { roundingDecimals = *attr.RoundDecimals } - maskDestId := exportTemplate.MaskDestId + maskDestId := exportTemplate.MaskDestinationID if attr.MaskDestinationId != nil && len(*attr.MaskDestinationId) != 0 { maskDestId = *attr.MaskDestinationId } @@ -168,11 +168,11 @@ func (self *ApierV1) ExportCdrsToFile(attr utils.AttrExpFileCdrs, reply *utils.E if attr.MaskLength != nil { maskLen = *attr.MaskLength } - cdrsFltr, err := attr.AsCdrsFilter(self.Config.DefaultTimezone) + cdrsFltr, err := attr.AsCDRsFilter(self.Config.DefaultTimezone) if err != nil { return utils.NewErrServerError(err) } - cdrs, _, err := self.CdrDb.GetStoredCdrs(cdrsFltr) + cdrs, _, err := self.CdrDb.GetCDRs(cdrsFltr) if err != nil { return err } else if len(cdrs) == 0 { @@ -204,7 +204,7 @@ func (self *ApierV1) RemCdrs(attrs utils.AttrRemCdrs, reply *string) error { if len(attrs.CgrIds) == 0 { return fmt.Errorf("%s:CgrIds", utils.ErrMandatoryIeMissing.Error()) } - if err := self.CdrDb.RemStoredCdrs(attrs.CgrIds); err != nil { + if err := self.CdrDb.RemCDRs(attrs.CgrIds); err != nil { return utils.NewErrServerError(err) } *reply = "OK" diff --git a/apier/v1/cdrs.go b/apier/v1/cdrs.go index 909766a0a..5f245e05c 100644 --- a/apier/v1/cdrs.go +++ b/apier/v1/cdrs.go @@ -42,18 +42,18 @@ func (apier *ApierV1) GetCallCostLog(attrs utils.AttrGetCallCost, reply *engine. } // Retrieves CDRs based on the filters -func (apier *ApierV1) GetCdrs(attrs utils.AttrGetCdrs, reply *[]*engine.ExternalCdr) error { - cdrsFltr, err := attrs.AsCdrsFilter(apier.Config.DefaultTimezone) +func (apier *ApierV1) GetCdrs(attrs utils.AttrGetCdrs, reply *[]*engine.ExternalCDR) error { + cdrsFltr, err := attrs.AsCDRsFilter(apier.Config.DefaultTimezone) if err != nil { return utils.NewErrServerError(err) } - if cdrs, _, err := apier.CdrDb.GetStoredCdrs(cdrsFltr); err != nil { + if cdrs, _, err := apier.CdrDb.GetCDRs(cdrsFltr); err != nil { return utils.NewErrServerError(err) } else if len(cdrs) == 0 { - *reply = make([]*engine.ExternalCdr, 0) + *reply = make([]*engine.ExternalCDR, 0) } else { for _, cdr := range cdrs { - *reply = append(*reply, cdr.AsExternalCdr()) + *reply = append(*reply, cdr.AsExternalCDR()) } } return nil diff --git a/apier/v1/cdrstatsv1_local_test.go b/apier/v1/cdrstatsv1_local_test.go index 4a4d6d24c..f39c1efc2 100644 --- a/apier/v1/cdrstatsv1_local_test.go +++ b/apier/v1/cdrstatsv1_local_test.go @@ -111,31 +111,34 @@ func TestCDRStatsLclPostCdrs(t *testing.T) { return } httpClient := new(http.Client) - storedCdrs := []*engine.StoredCdr{ - &engine.StoredCdr{CgrId: utils.Sha1("dsafdsafa", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderId: 123, TOR: utils.VOICE, AccId: "dsafdsaf", CdrHost: "192.168.1.1", CdrSource: "test", + storedCdrs := []*engine.CDR{ + &engine.CDR{CGRID: utils.Sha1("dsafdsafa", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderID: 123, TOR: utils.VOICE, OriginID: "dsafdsaf", + OriginHost: "192.168.1.1", Source: "test", ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "+4986517174963", SetupTime: time.Now(), - AnswerTime: time.Now(), MediationRunId: utils.DEFAULT_RUNID, - Usage: time.Duration(10) * time.Second, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, - Cost: 1.01, RatedAccount: "dan", RatedSubject: "dan", + AnswerTime: time.Now(), RunID: utils.DEFAULT_RUNID, Usage: time.Duration(10) * time.Second, + ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, }, - &engine.StoredCdr{CgrId: utils.Sha1("dsafdsafb", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderId: 123, TOR: utils.VOICE, AccId: "dsafdsaf", CdrHost: "192.168.1.1", CdrSource: "test", + &engine.CDR{CGRID: utils.Sha1("dsafdsafb", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderID: 123, TOR: utils.VOICE, OriginID: "dsafdsaf", + OriginHost: "192.168.1.1", Source: "test", ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "+4986517174963", SetupTime: time.Now(), - AnswerTime: time.Now(), MediationRunId: utils.DEFAULT_RUNID, - Usage: time.Duration(5) * time.Second, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, RatedAccount: "dan", RatedSubject: "dan", + AnswerTime: time.Now(), RunID: utils.DEFAULT_RUNID, + Usage: time.Duration(5) * time.Second, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, }, - &engine.StoredCdr{CgrId: utils.Sha1("dsafdsafc", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderId: 123, TOR: utils.VOICE, AccId: "dsafdsaf", CdrHost: "192.168.1.1", CdrSource: "test", + &engine.CDR{CGRID: utils.Sha1("dsafdsafc", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderID: 123, TOR: utils.VOICE, OriginID: "dsafdsaf", + OriginHost: "192.168.1.1", Source: "test", ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "+4986517174963", SetupTime: time.Now(), AnswerTime: time.Now(), - MediationRunId: utils.DEFAULT_RUNID, - Usage: time.Duration(30) * time.Second, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, RatedAccount: "dan", RatedSubject: "dan", + RunID: utils.DEFAULT_RUNID, + Usage: time.Duration(30) * time.Second, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, }, - &engine.StoredCdr{CgrId: utils.Sha1("dsafdsafd", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderId: 123, TOR: utils.VOICE, AccId: "dsafdsaf", CdrHost: "192.168.1.1", CdrSource: "test", + &engine.CDR{CGRID: utils.Sha1("dsafdsafd", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderID: 123, TOR: utils.VOICE, OriginID: "dsafdsaf", + OriginHost: "192.168.1.1", Source: "test", ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "+4986517174963", SetupTime: time.Now(), AnswerTime: time.Time{}, - MediationRunId: utils.DEFAULT_RUNID, - Usage: time.Duration(0) * time.Second, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, RatedAccount: "dan", RatedSubject: "dan", + RunID: utils.DEFAULT_RUNID, + Usage: time.Duration(0) * time.Second, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, }, } for _, storedCdr := range storedCdrs { diff --git a/apier/v1/cdrsv1.go b/apier/v1/cdrsv1.go index cdf43a646..cfefdcaef 100644 --- a/apier/v1/cdrsv1.go +++ b/apier/v1/cdrsv1.go @@ -31,7 +31,7 @@ type CdrsV1 struct { } // Designed for CGR internal usage -func (self *CdrsV1) ProcessCdr(cdr *engine.StoredCdr, reply *string) error { +func (self *CdrsV1) ProcessCdr(cdr *engine.CDR, reply *string) error { if err := self.CdrSrv.ProcessCdr(cdr); err != nil { return utils.NewErrServerError(err) } @@ -40,7 +40,7 @@ func (self *CdrsV1) ProcessCdr(cdr *engine.StoredCdr, reply *string) error { } // Designed for external programs feeding CDRs to CGRateS -func (self *CdrsV1) ProcessExternalCdr(cdr *engine.ExternalCdr, reply *string) error { +func (self *CdrsV1) ProcessExternalCdr(cdr *engine.ExternalCDR, reply *string) error { if err := self.CdrSrv.ProcessExternalCdr(cdr); err != nil { return utils.NewErrServerError(err) } @@ -64,7 +64,7 @@ func (self *CdrsV1) RateCdrs(attrs utils.AttrRateCdrs, reply *string) error { } //RateCdrs(cgrIds, runIds, tors, cdrHosts, cdrSources, reqTypes, directions, tenants, categories, accounts, subjects, destPrefixes []string, //orderIdStart, orderIdEnd int64, timeStart, timeEnd time.Time, rerateErrors, rerateRated bool) - if err := self.CdrSrv.RateCdrs(attrs.CgrIds, attrs.MediationRunIds, attrs.TORs, attrs.CdrHosts, attrs.CdrSources, attrs.ReqTypes, attrs.Directions, + if err := self.CdrSrv.RateCDRs(attrs.CgrIds, attrs.MediationRunIds, attrs.TORs, attrs.CdrHosts, attrs.CdrSources, attrs.ReqTypes, attrs.Directions, attrs.Tenants, attrs.Categories, attrs.Accounts, attrs.Subjects, attrs.DestinationPrefixes, attrs.RatedAccounts, attrs.RatedSubjects, attrs.OrderIdStart, attrs.OrderIdEnd, tStart, tEnd, attrs.RerateErrors, attrs.RerateRated, attrs.SendToStats); err != nil { return utils.NewErrServerError(err) diff --git a/apier/v1/derivedcharging.go b/apier/v1/derivedcharging.go index 5e74fb00d..0c573f797 100644 --- a/apier/v1/derivedcharging.go +++ b/apier/v1/derivedcharging.go @@ -78,7 +78,7 @@ func (self *ApierV1) SetDerivedChargers(attrs AttrSetDerivedChargers, reply *str } } dstIds := strings.Split(attrs.DestinationIds, utils.INFIELD_SEP) - dcs := &utils.DerivedChargers{DestinationIds: utils.NewStringMap(dstIds...), Chargers: attrs.DerivedChargers} + dcs := &utils.DerivedChargers{DestinationIDs: utils.NewStringMap(dstIds...), Chargers: attrs.DerivedChargers} if err := self.RatingDb.SetDerivedChargers(dcKey, dcs); err != nil { return utils.NewErrServerError(err) } diff --git a/apier/v1/derivedcharging_test.go b/apier/v1/derivedcharging_test.go index dfc2df07c..a049dd63e 100644 --- a/apier/v1/derivedcharging_test.go +++ b/apier/v1/derivedcharging_test.go @@ -49,9 +49,9 @@ func TestGetEmptyDC(t *testing.T) { func TestSetDC(t *testing.T) { dcs1 := []*utils.DerivedCharger{ - &utils.DerivedCharger{RunId: "extra1", ReqTypeField: "^prepaid", DirectionField: "*default", TenantField: "*default", CategoryField: "*default", + &utils.DerivedCharger{RunID: "extra1", ReqTypeField: "^prepaid", DirectionField: "*default", TenantField: "*default", CategoryField: "*default", AccountField: "rif", SubjectField: "rif", DestinationField: "*default", SetupTimeField: "*default", AnswerTimeField: "*default", UsageField: "*default"}, - &utils.DerivedCharger{RunId: "extra2", ReqTypeField: "*default", DirectionField: "*default", TenantField: "*default", CategoryField: "*default", + &utils.DerivedCharger{RunID: "extra2", ReqTypeField: "*default", DirectionField: "*default", TenantField: "*default", CategoryField: "*default", AccountField: "ivo", SubjectField: "ivo", DestinationField: "*default", SetupTimeField: "*default", AnswerTimeField: "*default", UsageField: "*default"}, } attrs := AttrSetDerivedChargers{Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "dan", Subject: "dan", DerivedChargers: dcs1} @@ -65,18 +65,18 @@ func TestSetDC(t *testing.T) { func TestGetDC(t *testing.T) { attrs := utils.AttrDerivedChargers{Tenant: "cgrates.org", Category: "call", Direction: "*out", Account: "dan", Subject: "dan"} - eDcs := utils.DerivedChargers{DestinationIds: utils.NewStringMap(), + eDcs := utils.DerivedChargers{DestinationIDs: utils.NewStringMap(), Chargers: []*utils.DerivedCharger{ - &utils.DerivedCharger{RunId: "extra1", ReqTypeField: "^prepaid", DirectionField: "*default", TenantField: "*default", CategoryField: "*default", + &utils.DerivedCharger{RunID: "extra1", ReqTypeField: "^prepaid", DirectionField: "*default", TenantField: "*default", CategoryField: "*default", AccountField: "rif", SubjectField: "rif", DestinationField: "*default", SetupTimeField: "*default", AnswerTimeField: "*default", UsageField: "*default"}, - &utils.DerivedCharger{RunId: "extra2", ReqTypeField: "*default", DirectionField: "*default", TenantField: "*default", CategoryField: "*default", + &utils.DerivedCharger{RunID: "extra2", ReqTypeField: "*default", DirectionField: "*default", TenantField: "*default", CategoryField: "*default", AccountField: "ivo", SubjectField: "ivo", DestinationField: "*default", SetupTimeField: "*default", AnswerTimeField: "*default", UsageField: "*default"}, }} var dcs utils.DerivedChargers if err := apierDcT.GetDerivedChargers(attrs, &dcs); err != nil { t.Error("Unexpected error", err.Error()) } else if !reflect.DeepEqual(dcs, eDcs) { - t.Errorf("Expecting: %v, received: %v", eDcs.DestinationIds, dcs.DestinationIds) + t.Errorf("Expecting: %v, received: %v", eDcs.DestinationIDs, dcs.DestinationIDs) } } diff --git a/apier/v2/cdre.go b/apier/v2/cdre.go index dbeaee933..3bb7b0697 100644 --- a/apier/v2/cdre.go +++ b/apier/v2/cdre.go @@ -56,19 +56,19 @@ func (self *ApierV2) ExportCdrsToFile(attr utils.AttrExportCdrsToFile, reply *ut return fmt.Errorf("%s:FieldSeparator:%s", utils.ErrServerError, "Invalid") } } - exportDir := exportTemplate.ExportDir - if attr.ExportDir != nil && len(*attr.ExportDir) != 0 { - exportDir = *attr.ExportDir + ExportFolder := exportTemplate.ExportFolder + if attr.ExportFolder != nil && len(*attr.ExportFolder) != 0 { + ExportFolder = *attr.ExportFolder } - exportId := strconv.FormatInt(time.Now().Unix(), 10) - if attr.ExportId != nil && len(*attr.ExportId) != 0 { - exportId = *attr.ExportId + ExportID := strconv.FormatInt(time.Now().Unix(), 10) + if attr.ExportID != nil && len(*attr.ExportID) != 0 { + ExportID = *attr.ExportID } - fileName := fmt.Sprintf("cdre_%s.%s", exportId, cdrFormat) + fileName := fmt.Sprintf("cdre_%s.%s", ExportID, cdrFormat) if attr.ExportFileName != nil && len(*attr.ExportFileName) != 0 { fileName = *attr.ExportFileName } - filePath := path.Join(exportDir, fileName) + filePath := path.Join(ExportFolder, fileName) if cdrFormat == utils.DRYRUN { filePath = utils.DRYRUN } @@ -76,9 +76,9 @@ func (self *ApierV2) ExportCdrsToFile(attr utils.AttrExportCdrsToFile, reply *ut if attr.DataUsageMultiplyFactor != nil && *attr.DataUsageMultiplyFactor != 0.0 { dataUsageMultiplyFactor = *attr.DataUsageMultiplyFactor } - smsUsageMultiplyFactor := exportTemplate.SmsUsageMultiplyFactor - if attr.SmsUsageMultiplyFactor != nil && *attr.SmsUsageMultiplyFactor != 0.0 { - smsUsageMultiplyFactor = *attr.SmsUsageMultiplyFactor + SMSUsageMultiplyFactor := exportTemplate.SMSUsageMultiplyFactor + if attr.SMSUsageMultiplyFactor != nil && *attr.SMSUsageMultiplyFactor != 0.0 { + SMSUsageMultiplyFactor = *attr.SMSUsageMultiplyFactor } genericUsageMultiplyFactor := exportTemplate.GenericUsageMultiplyFactor if attr.GenericUsageMultiplyFactor != nil && *attr.GenericUsageMultiplyFactor != 0.0 { @@ -96,26 +96,26 @@ func (self *ApierV2) ExportCdrsToFile(attr utils.AttrExportCdrsToFile, reply *ut if attr.RoundDecimals != nil { roundingDecimals = *attr.RoundDecimals } - maskDestId := exportTemplate.MaskDestId - if attr.MaskDestinationId != nil && len(*attr.MaskDestinationId) != 0 { - maskDestId = *attr.MaskDestinationId + maskDestId := exportTemplate.MaskDestinationID + if attr.MaskDestinationID != nil && len(*attr.MaskDestinationID) != 0 { + maskDestId = *attr.MaskDestinationID } maskLen := exportTemplate.MaskLength if attr.MaskLength != nil { maskLen = *attr.MaskLength } - cdrsFltr, err := attr.RpcCdrsFilter.AsCdrsFilter(self.Config.DefaultTimezone) + cdrsFltr, err := attr.RPCCDRsFilter.AsCDRsFilter(self.Config.DefaultTimezone) if err != nil { return utils.NewErrServerError(err) } - cdrs, _, err := self.CdrDb.GetStoredCdrs(cdrsFltr) + cdrs, _, err := self.CdrDb.GetCDRs(cdrsFltr) if err != nil { return err } else if len(cdrs) == 0 { *reply = utils.ExportedFileCdrs{ExportedFilePath: ""} return nil } - cdrexp, err := cdre.NewCdrExporter(cdrs, self.CdrDb, exportTemplate, cdrFormat, fieldSep, exportId, dataUsageMultiplyFactor, smsUsageMultiplyFactor, genericUsageMultiplyFactor, + cdrexp, err := cdre.NewCdrExporter(cdrs, self.CdrDb, exportTemplate, cdrFormat, fieldSep, ExportID, dataUsageMultiplyFactor, SMSUsageMultiplyFactor, genericUsageMultiplyFactor, costMultiplyFactor, costShiftDigits, roundingDecimals, self.Config.RoundingDecimals, maskDestId, maskLen, self.Config.HttpSkipTlsVerify, self.Config.DefaultTimezone) if err != nil { return utils.NewErrServerError(err) @@ -128,7 +128,7 @@ func (self *ApierV2) ExportCdrsToFile(attr utils.AttrExportCdrsToFile, reply *ut return utils.NewErrServerError(err) } *reply = utils.ExportedFileCdrs{ExportedFilePath: filePath, TotalRecords: len(cdrs), TotalCost: cdrexp.TotalCost(), FirstOrderId: cdrexp.FirstOrderId(), LastOrderId: cdrexp.LastOrderId()} - if !attr.SuppressCgrIds { + if !attr.Verbose { reply.ExportedCgrIds = cdrexp.PositiveExports() reply.UnexportedCgrIds = cdrexp.NegativeExports() } diff --git a/apier/v2/cdrs.go b/apier/v2/cdrs.go index b6fa0f5c8..99d7bb030 100644 --- a/apier/v2/cdrs.go +++ b/apier/v2/cdrs.go @@ -26,30 +26,30 @@ import ( ) // Retrieves CDRs based on the filters -func (apier *ApierV2) GetCdrs(attrs utils.RpcCdrsFilter, reply *[]*engine.ExternalCdr) error { - cdrsFltr, err := attrs.AsCdrsFilter(apier.Config.DefaultTimezone) +func (apier *ApierV2) GetCdrs(attrs utils.RPCCDRsFilter, reply *[]*engine.ExternalCDR) error { + cdrsFltr, err := attrs.AsCDRsFilter(apier.Config.DefaultTimezone) if err != nil { return utils.NewErrServerError(err) } - if cdrs, _, err := apier.CdrDb.GetStoredCdrs(cdrsFltr); err != nil { + if cdrs, _, err := apier.CdrDb.GetCDRs(cdrsFltr); err != nil { return utils.NewErrServerError(err) } else if len(cdrs) == 0 { - *reply = make([]*engine.ExternalCdr, 0) + *reply = make([]*engine.ExternalCDR, 0) } else { for _, cdr := range cdrs { - *reply = append(*reply, cdr.AsExternalCdr()) + *reply = append(*reply, cdr.AsExternalCDR()) } } return nil } -func (apier *ApierV2) CountCdrs(attrs utils.RpcCdrsFilter, reply *int64) error { - cdrsFltr, err := attrs.AsCdrsFilter(apier.Config.DefaultTimezone) +func (apier *ApierV2) CountCdrs(attrs utils.RPCCDRsFilter, reply *int64) error { + cdrsFltr, err := attrs.AsCDRsFilter(apier.Config.DefaultTimezone) if err != nil { return utils.NewErrServerError(err) } cdrsFltr.Count = true - if _, count, err := apier.CdrDb.GetStoredCdrs(cdrsFltr); err != nil { + if _, count, err := apier.CdrDb.GetCDRs(cdrsFltr); err != nil { return utils.NewErrServerError(err) } else { *reply = count diff --git a/apier/v2/cdrs_mongo_local_test.go b/apier/v2/cdrs_mongo_local_test.go index 8ce6186ea..e69a87623 100644 --- a/apier/v2/cdrs_mongo_local_test.go +++ b/apier/v2/cdrs_mongo_local_test.go @@ -73,12 +73,12 @@ func TestV2CdrsMongoInjectUnratedCdr(t *testing.T) { t.Error("Error on opening database connection: ", err) return } - strCdr1 := &engine.StoredCdr{CgrId: utils.Sha1("bbb1", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()), - TOR: utils.VOICE, AccId: "bbb1", CdrHost: "192.168.1.1", CdrSource: "UNKNOWN", ReqType: utils.META_RATED, + strCdr1 := &engine.CDR{CGRID: utils.Sha1("bbb1", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()), + TOR: utils.VOICE, OriginID: "bbb1", OriginHost: "192.168.1.1", Source: "UNKNOWN", ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002", SetupTime: time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC), AnswerTime: time.Date(2013, 12, 7, 8, 42, 26, 0, time.UTC), Usage: time.Duration(10) * time.Second, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, - MediationRunId: utils.DEFAULT_RUNID, Cost: 1.201} + RunID: utils.DEFAULT_RUNID, Cost: 1.201} if err := mysqlDb.SetCdr(strCdr1); err != nil { t.Error(err.Error()) } @@ -111,24 +111,25 @@ func TestV2CdrsMongoProcessCdr(t *testing.T) { return } var reply string - cdrs := []*engine.StoredCdr{ - &engine.StoredCdr{CgrId: utils.Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderId: 123, TOR: utils.VOICE, AccId: "dsafdsaf", - CdrHost: "192.168.1.1", CdrSource: "test", ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002", - SetupTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), MediationRunId: utils.DEFAULT_RUNID, + cdrs := []*engine.CDR{ + &engine.CDR{CGRID: utils.Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderID: 123, TOR: utils.VOICE, OriginID: "dsafdsaf", + OriginHost: "192.168.1.1", Source: "test", ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", + Subject: "1001", Destination: "1002", + SetupTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), RunID: utils.DEFAULT_RUNID, Usage: time.Duration(10) * time.Second, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, - RatedAccount: "dan", RatedSubject: "dans", Rated: true, + Rated: true, }, - &engine.StoredCdr{CgrId: utils.Sha1("abcdeftg", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderId: 123, TOR: utils.VOICE, AccId: "dsafdsaf", - CdrHost: "192.168.1.1", CdrSource: "test", ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1002", Subject: "1002", Destination: "1002", - SetupTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), MediationRunId: utils.DEFAULT_RUNID, + &engine.CDR{CGRID: utils.Sha1("abcdeftg", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderID: 123, TOR: utils.VOICE, OriginID: "dsafdsaf", + OriginHost: "192.168.1.1", Source: "test", ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1002", + Subject: "1002", Destination: "1002", + SetupTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), RunID: utils.DEFAULT_RUNID, Usage: time.Duration(10) * time.Second, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, - RatedAccount: "dan", RatedSubject: "dans", }, - &engine.StoredCdr{CgrId: utils.Sha1("aererfddf", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderId: 123, TOR: utils.VOICE, AccId: "dsafdsaf", - CdrHost: "192.168.1.1", CdrSource: "test", ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1003", Subject: "1003", Destination: "1002", - SetupTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), MediationRunId: utils.DEFAULT_RUNID, + &engine.CDR{CGRID: utils.Sha1("aererfddf", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderID: 123, TOR: utils.VOICE, OriginID: "dsafdsaf", + OriginHost: "192.168.1.1", Source: "test", ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1003", + Subject: "1003", Destination: "1002", + SetupTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), RunID: utils.DEFAULT_RUNID, Usage: time.Duration(10) * time.Second, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, - RatedAccount: "dan", RatedSubject: "dans", }, } for _, cdr := range cdrs { @@ -144,50 +145,50 @@ func TestV2CdrsMongoGetCdrs(t *testing.T) { if !*testLocal { return } - var reply []*engine.ExternalCdr - req := utils.RpcCdrsFilter{NotCdrSources: []string{"CDRS"}} + var reply []*engine.ExternalCDR + req := utils.RPCCDRsFilter{NotSources: []string{"CDRS"}} if err := cdrsMongoRpc.Call("ApierV2.GetCdrs", req, &reply); err != nil { t.Error("Unexpected error: ", err.Error()) } else if len(reply) != 4 { for _, cdr := range reply { - t.Logf("CDR: %s %s %s", cdr.CgrId, cdr.CdrSource, cdr.MediationRunId) + t.Logf("CDR: %s %s %s", cdr.CGRID, cdr.Source, cdr.RunID) } t.Error("Unexpected number of CDRs returned: ", len(reply)) } // CDRs with errors - req = utils.RpcCdrsFilter{NotCdrSources: []string{"CDRS"}, MinCost: utils.Float64Pointer(-1.0), MaxCost: utils.Float64Pointer(0.0)} + req = utils.RPCCDRsFilter{NotSources: []string{"CDRS"}, MinCost: utils.Float64Pointer(-1.0), MaxCost: utils.Float64Pointer(0.0)} if err := cdrsMongoRpc.Call("ApierV2.GetCdrs", req, &reply); err != nil { t.Error("Unexpected error: ", err.Error()) } else if len(reply) != 2 { t.Error("Unexpected number of CDRs returned: ", reply) } // CDRs Rated - req = utils.RpcCdrsFilter{NotCdrSources: []string{"CDRS"}, MinCost: utils.Float64Pointer(-1.0)} + req = utils.RPCCDRsFilter{NotSources: []string{"CDRS"}, MinCost: utils.Float64Pointer(-1.0)} if err := cdrsMongoRpc.Call("ApierV2.GetCdrs", req, &reply); err != nil { t.Error("Unexpected error: ", err.Error()) } else if len(reply) != 4 { for _, cdr := range reply { - t.Logf("CDR: %s %s %s %f", cdr.CgrId, cdr.CdrSource, cdr.MediationRunId, cdr.Cost) + t.Logf("CDR: %s %s %s %f", cdr.CGRID, cdr.Source, cdr.RunID, cdr.Cost) } t.Error("Unexpected number of CDRs returned: ", reply) } // CDRs non rated OR SkipRated - req = utils.RpcCdrsFilter{NotCdrSources: []string{"CDRS"}, MaxCost: utils.Float64Pointer(-1.0)} + req = utils.RPCCDRsFilter{NotSources: []string{"CDRS"}, MaxCost: utils.Float64Pointer(-1.0)} if err := cdrsMongoRpc.Call("ApierV2.GetCdrs", req, &reply); err != nil { t.Error("Unexpected error: ", err.Error()) } else if len(reply) != 0 { for _, cdr := range reply { - t.Logf("CDR: %s %s %s %f", cdr.CgrId, cdr.CdrSource, cdr.MediationRunId, cdr.Cost) + t.Logf("CDR: %s %s %s %f", cdr.CGRID, cdr.Source, cdr.RunID, cdr.Cost) } t.Error("Unexpected number of CDRs returned: ", reply) } // Skip Errors - req = utils.RpcCdrsFilter{NotCdrSources: []string{"CDRS"}, MinCost: utils.Float64Pointer(0.0), MaxCost: utils.Float64Pointer(-1.0)} + req = utils.RPCCDRsFilter{NotSources: []string{"CDRS"}, MinCost: utils.Float64Pointer(0.0), MaxCost: utils.Float64Pointer(-1.0)} if err := cdrsMongoRpc.Call("ApierV2.GetCdrs", req, &reply); err != nil { t.Error("Unexpected error: ", err.Error()) } else if len(reply) != 2 { for _, cdr := range reply { - t.Logf("CDR: %s %s %s %f", cdr.CgrId, cdr.CdrSource, cdr.MediationRunId, cdr.Cost) + t.Logf("CDR: %s %s %s %f", cdr.CGRID, cdr.Source, cdr.RunID, cdr.Cost) } t.Error("Unexpected number of CDRs returned: ", reply) } @@ -212,24 +213,21 @@ func TestV2CdrsMongoProcessPrepaidCdr(t *testing.T) { return } var reply string - cdrs := []*engine.StoredCdr{ - &engine.StoredCdr{CgrId: utils.Sha1("dsafdsaf2", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderId: 123, TOR: utils.VOICE, AccId: "dsafdsaf", - CdrHost: "192.168.1.1", CdrSource: "test", ReqType: utils.META_PREPAID, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002", - SetupTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), MediationRunId: utils.DEFAULT_RUNID, - Usage: time.Duration(10) * time.Second, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, - RatedAccount: "dan", RatedSubject: "dans", Rated: true, + cdrs := []*engine.CDR{ + &engine.CDR{CGRID: utils.Sha1("dsafdsaf2", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderID: 123, TOR: utils.VOICE, OriginID: "dsafdsaf", + OriginHost: "192.168.1.1", Source: "test", ReqType: utils.META_PREPAID, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002", + SetupTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), RunID: utils.DEFAULT_RUNID, + Usage: time.Duration(10) * time.Second, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, Rated: true, }, - &engine.StoredCdr{CgrId: utils.Sha1("abcdeftg2", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderId: 123, TOR: utils.VOICE, AccId: "dsafdsaf", - CdrHost: "192.168.1.1", CdrSource: "test", ReqType: utils.META_PREPAID, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1002", Subject: "1002", Destination: "1002", - SetupTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), MediationRunId: utils.DEFAULT_RUNID, + &engine.CDR{CGRID: utils.Sha1("abcdeftg2", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderID: 123, TOR: utils.VOICE, OriginID: "dsafdsaf", + OriginHost: "192.168.1.1", Source: "test", ReqType: utils.META_PREPAID, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1002", Subject: "1002", Destination: "1002", + SetupTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), RunID: utils.DEFAULT_RUNID, Usage: time.Duration(10) * time.Second, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, - RatedAccount: "dan", RatedSubject: "dans", }, - &engine.StoredCdr{CgrId: utils.Sha1("aererfddf2", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderId: 123, TOR: utils.VOICE, AccId: "dsafdsaf", - CdrHost: "192.168.1.1", CdrSource: "test", ReqType: utils.META_PREPAID, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1003", Subject: "1003", Destination: "1002", - SetupTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), MediationRunId: utils.DEFAULT_RUNID, + &engine.CDR{CGRID: utils.Sha1("aererfddf2", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderID: 123, TOR: utils.VOICE, OriginID: "dsafdsaf", + OriginHost: "192.168.1.1", Source: "test", ReqType: utils.META_PREPAID, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1003", Subject: "1003", Destination: "1002", + SetupTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), RunID: utils.DEFAULT_RUNID, Usage: time.Duration(10) * time.Second, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, - RatedAccount: "dan", RatedSubject: "dans", }, } tStart := time.Now() diff --git a/apier/v2/cdrs_mysql_local_test.go b/apier/v2/cdrs_mysql_local_test.go index 0cadbe1d4..d2850f43b 100644 --- a/apier/v2/cdrs_mysql_local_test.go +++ b/apier/v2/cdrs_mysql_local_test.go @@ -79,12 +79,12 @@ func TestV2CdrsMysqlInjectUnratedCdr(t *testing.T) { t.Error("Error on opening database connection: ", err) return } - strCdr1 := &engine.StoredCdr{CgrId: utils.Sha1("bbb1", time.Date(2015, 11, 21, 10, 47, 24, 0, time.UTC).String()), - TOR: utils.VOICE, AccId: "bbb1", CdrHost: "192.168.1.1", CdrSource: "UNKNOWN", ReqType: utils.META_RATED, + strCdr1 := &engine.CDR{CGRID: utils.Sha1("bbb1", time.Date(2015, 11, 21, 10, 47, 24, 0, time.UTC).String()), + TOR: utils.VOICE, OriginID: "bbb1", OriginHost: "192.168.1.1", Source: "UNKNOWN", ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002", SetupTime: time.Date(2015, 11, 21, 10, 47, 24, 0, time.UTC), AnswerTime: time.Date(2015, 11, 21, 10, 47, 26, 0, time.UTC), Usage: time.Duration(10) * time.Second, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, - MediationRunId: utils.DEFAULT_RUNID, Cost: 1.201} + RunID: utils.DEFAULT_RUNID, Cost: 1.201} if err := mysqlDb.SetCdr(strCdr1); err != nil { t.Error(err.Error()) } @@ -117,24 +117,21 @@ func TestV2CdrsMysqlProcessCdr(t *testing.T) { return } var reply string - cdrs := []*engine.StoredCdr{ - &engine.StoredCdr{CgrId: utils.Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderId: 123, TOR: utils.VOICE, AccId: "dsafdsaf", - CdrHost: "192.168.1.1", CdrSource: "test", ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002", - SetupTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), MediationRunId: utils.DEFAULT_RUNID, - Usage: time.Duration(10) * time.Second, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, - RatedAccount: "dan", RatedSubject: "dans", Rated: true, + cdrs := []*engine.CDR{ + &engine.CDR{CGRID: utils.Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderID: 123, TOR: utils.VOICE, OriginID: "dsafdsaf", + OriginHost: "192.168.1.1", Source: "test", ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002", + SetupTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), RunID: utils.DEFAULT_RUNID, + Usage: time.Duration(10) * time.Second, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, Rated: true, }, - &engine.StoredCdr{CgrId: utils.Sha1("abcdeftg", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderId: 123, TOR: utils.VOICE, AccId: "dsafdsaf", - CdrHost: "192.168.1.1", CdrSource: "test", ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1002", Subject: "1002", Destination: "1002", - SetupTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), MediationRunId: utils.DEFAULT_RUNID, + &engine.CDR{CGRID: utils.Sha1("abcdeftg", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderID: 123, TOR: utils.VOICE, OriginID: "dsafdsaf", + OriginHost: "192.168.1.1", Source: "test", ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1002", Subject: "1002", Destination: "1002", + SetupTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), RunID: utils.DEFAULT_RUNID, Usage: time.Duration(10) * time.Second, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, - RatedAccount: "dan", RatedSubject: "dans", }, - &engine.StoredCdr{CgrId: utils.Sha1("aererfddf", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderId: 123, TOR: utils.VOICE, AccId: "dsafdsaf", - CdrHost: "192.168.1.1", CdrSource: "test", ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1003", Subject: "1003", Destination: "1002", - SetupTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), MediationRunId: utils.DEFAULT_RUNID, + &engine.CDR{CGRID: utils.Sha1("aererfddf", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderID: 123, TOR: utils.VOICE, OriginID: "dsafdsaf", + OriginHost: "192.168.1.1", Source: "test", ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1003", Subject: "1003", Destination: "1002", + SetupTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), RunID: utils.DEFAULT_RUNID, Usage: time.Duration(10) * time.Second, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, - RatedAccount: "dan", RatedSubject: "dans", }, } for _, cdr := range cdrs { @@ -150,36 +147,36 @@ func TestV2CdrsMysqlGetCdrs(t *testing.T) { if !*testLocal { return } - var reply []*engine.ExternalCdr - req := utils.RpcCdrsFilter{} + var reply []*engine.ExternalCDR + req := utils.RPCCDRsFilter{} if err := cdrsRpc.Call("ApierV2.GetCdrs", req, &reply); err != nil { t.Error("Unexpected error: ", err.Error()) } else if len(reply) != 4 { t.Error("Unexpected number of CDRs returned: ", len(reply)) } // CDRs with errors - req = utils.RpcCdrsFilter{MinCost: utils.Float64Pointer(-1.0), MaxCost: utils.Float64Pointer(0.0)} + req = utils.RPCCDRsFilter{MinCost: utils.Float64Pointer(-1.0), MaxCost: utils.Float64Pointer(0.0)} if err := cdrsRpc.Call("ApierV2.GetCdrs", req, &reply); err != nil { t.Error("Unexpected error: ", err.Error()) } else if len(reply) != 2 { t.Error("Unexpected number of CDRs returned: ", reply) } // CDRs Rated - req = utils.RpcCdrsFilter{MinCost: utils.Float64Pointer(-1.0)} + req = utils.RPCCDRsFilter{MinCost: utils.Float64Pointer(-1.0)} if err := cdrsRpc.Call("ApierV2.GetCdrs", req, &reply); err != nil { t.Error("Unexpected error: ", err.Error()) } else if len(reply) != 3 { t.Error("Unexpected number of CDRs returned: ", reply) } // CDRs non rated OR SkipRated - req = utils.RpcCdrsFilter{MaxCost: utils.Float64Pointer(-1.0)} + req = utils.RPCCDRsFilter{MaxCost: utils.Float64Pointer(-1.0)} if err := cdrsRpc.Call("ApierV2.GetCdrs", req, &reply); err != nil { t.Error("Unexpected error: ", err.Error()) } else if len(reply) != 1 { t.Error("Unexpected number of CDRs returned: ", reply) } // Skip Errors - req = utils.RpcCdrsFilter{MinCost: utils.Float64Pointer(0.0), MaxCost: utils.Float64Pointer(-1.0)} + req = utils.RPCCDRsFilter{MinCost: utils.Float64Pointer(0.0), MaxCost: utils.Float64Pointer(-1.0)} if err := cdrsRpc.Call("ApierV2.GetCdrs", req, &reply); err != nil { t.Error("Unexpected error: ", err.Error()) } else if len(reply) != 2 { @@ -206,24 +203,21 @@ func TestV2CdrsMysqlProcessPrepaidCdr(t *testing.T) { return } var reply string - cdrs := []*engine.StoredCdr{ - &engine.StoredCdr{CgrId: utils.Sha1("dsafdsaf2", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderId: 123, TOR: utils.VOICE, AccId: "dsafdsaf", - CdrHost: "192.168.1.1", CdrSource: "test", ReqType: utils.META_PREPAID, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002", - SetupTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), MediationRunId: utils.DEFAULT_RUNID, - Usage: time.Duration(10) * time.Second, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, - RatedAccount: "dan", RatedSubject: "dans", Rated: true, + cdrs := []*engine.CDR{ + &engine.CDR{CGRID: utils.Sha1("dsafdsaf2", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderID: 123, TOR: utils.VOICE, OriginID: "dsafdsaf", + OriginHost: "192.168.1.1", Source: "test", ReqType: utils.META_PREPAID, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002", + SetupTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), RunID: utils.DEFAULT_RUNID, + Usage: time.Duration(10) * time.Second, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, Rated: true, }, - &engine.StoredCdr{CgrId: utils.Sha1("abcdeftg2", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderId: 123, TOR: utils.VOICE, AccId: "dsafdsaf", - CdrHost: "192.168.1.1", CdrSource: "test", ReqType: utils.META_PREPAID, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1002", Subject: "1002", Destination: "1002", - SetupTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), MediationRunId: utils.DEFAULT_RUNID, + &engine.CDR{CGRID: utils.Sha1("abcdeftg2", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderID: 123, TOR: utils.VOICE, OriginID: "dsafdsaf", + OriginHost: "192.168.1.1", Source: "test", ReqType: utils.META_PREPAID, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1002", Subject: "1002", Destination: "1002", + SetupTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), RunID: utils.DEFAULT_RUNID, Usage: time.Duration(10) * time.Second, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, - RatedAccount: "dan", RatedSubject: "dans", }, - &engine.StoredCdr{CgrId: utils.Sha1("aererfddf2", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderId: 123, TOR: utils.VOICE, AccId: "dsafdsaf", - CdrHost: "192.168.1.1", CdrSource: "test", ReqType: utils.META_PREPAID, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1003", Subject: "1003", Destination: "1002", - SetupTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), MediationRunId: utils.DEFAULT_RUNID, + &engine.CDR{CGRID: utils.Sha1("aererfddf2", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderID: 123, TOR: utils.VOICE, OriginID: "dsafdsaf", + OriginHost: "192.168.1.1", Source: "test", ReqType: utils.META_PREPAID, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1003", Subject: "1003", Destination: "1002", + SetupTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), RunID: utils.DEFAULT_RUNID, Usage: time.Duration(10) * time.Second, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, - RatedAccount: "dan", RatedSubject: "dans", }, } tStart := time.Now() @@ -243,17 +237,17 @@ func TestV2CdrsMysqlRateWithoutTP(t *testing.T) { if !*testLocal { return } - rawCdrCgrId := utils.Sha1("bbb1", time.Date(2015, 11, 21, 10, 47, 24, 0, time.UTC).String()) + rawCdrCGRID := utils.Sha1("bbb1", time.Date(2015, 11, 21, 10, 47, 24, 0, time.UTC).String()) // Rate the injected CDR, should not rate it since we have no TP loaded - attrs := utils.AttrRateCdrs{CgrIds: []string{rawCdrCgrId}} + attrs := utils.AttrRateCdrs{CgrIds: []string{rawCdrCGRID}} var reply string if err := cdrsRpc.Call("CdrsV2.RateCdrs", attrs, &reply); err != nil { t.Error("Unexpected error: ", err.Error()) } else if reply != utils.OK { t.Error("Unexpected reply received: ", reply) } - var cdrs []*engine.ExternalCdr - req := utils.RpcCdrsFilter{CgrIds: []string{rawCdrCgrId}} + var cdrs []*engine.ExternalCDR + req := utils.RPCCDRsFilter{CGRIDs: []string{rawCdrCGRID}} if err := cdrsRpc.Call("ApierV2.GetCdrs", req, &cdrs); err != nil { t.Error("Unexpected error: ", err.Error()) } else if len(cdrs) != 1 { @@ -283,16 +277,16 @@ func TestV2CdrsMysqlRateWithTP(t *testing.T) { if !*testLocal { return } - rawCdrCgrId := utils.Sha1("bbb1", time.Date(2015, 11, 21, 10, 47, 24, 0, time.UTC).String()) - attrs := utils.AttrRateCdrs{CgrIds: []string{rawCdrCgrId}} + rawCdrCGRID := utils.Sha1("bbb1", time.Date(2015, 11, 21, 10, 47, 24, 0, time.UTC).String()) + attrs := utils.AttrRateCdrs{CgrIds: []string{rawCdrCGRID}} var reply string if err := cdrsRpc.Call("CdrsV2.RateCdrs", attrs, &reply); err != nil { t.Error("Unexpected error: ", err.Error()) } else if reply != utils.OK { t.Error("Unexpected reply received: ", reply) } - var cdrs []*engine.ExternalCdr - req := utils.RpcCdrsFilter{CgrIds: []string{rawCdrCgrId}} + var cdrs []*engine.ExternalCDR + req := utils.RPCCDRsFilter{CGRIDs: []string{rawCdrCGRID}} if err := cdrsRpc.Call("ApierV2.GetCdrs", req, &cdrs); err != nil { t.Error("Unexpected error: ", err.Error()) } else if len(cdrs) != 1 { @@ -310,8 +304,8 @@ func TestV2CdrsMysqlProcessRatedExternalCdrBenchmark(t *testing.T) { if !*testLocal { return } - cdr := &engine.ExternalCdr{TOR: utils.VOICE, - AccId: "benchratedcdr", CdrHost: "192.168.1.1", CdrSource: utils.UNIT_TEST, ReqType: utils.META_RATED, Direction: utils.OUT, + cdr := &engine.ExternalCDR{TOR: utils.VOICE, + OriginID: "benchratedcdr", OriginHost: "192.168.1.1", Source: utils.UNIT_TEST, ReqType: utils.META_RATED, Direction: utils.OUT, Tenant: "cgrates.org", Category: "call", Account: "1003", Subject: "1003", Destination: "1001", Supplier: "SUPPL1", SetupTime: "2014-08-04T13:00:00Z", AnswerTime: "2014-08-04T13:00:07Z", Usage: "15", Pdd: "7.0", ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, @@ -320,7 +314,7 @@ func TestV2CdrsMysqlProcessRatedExternalCdrBenchmark(t *testing.T) { tStart := time.Now() nrCdrs := 1000 for i := 0; i < nrCdrs; i++ { - cdr.AccId = "benchratedcdr" + strconv.Itoa(i) + cdr.OriginID = "benchratedcdr" + strconv.Itoa(i) if err := cdrsRpc.Call("CdrsV2.ProcessExternalCdr", cdr, &reply); err != nil { t.Error("Unexpected error: ", err.Error()) } else if reply != utils.OK { @@ -359,8 +353,8 @@ func TestV2CdrsMysqlProcessPostpaidExternalCdrBenchmark(t *testing.T) { if !*testLocal { return } - cdr := &engine.ExternalCdr{TOR: utils.VOICE, - AccId: "benchpostpaidcdr", CdrHost: "192.168.1.1", CdrSource: utils.UNIT_TEST, ReqType: utils.META_POSTPAID, Direction: utils.OUT, + cdr := &engine.ExternalCDR{TOR: utils.VOICE, + OriginID: "benchpostpaidcdr", OriginHost: "192.168.1.1", Source: utils.UNIT_TEST, ReqType: utils.META_POSTPAID, Direction: utils.OUT, Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002", Supplier: "SUPPL1", SetupTime: "2014-08-04T13:00:00Z", AnswerTime: "2014-08-04T13:00:07Z", Usage: "15", Pdd: "7.0", ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, @@ -369,7 +363,7 @@ func TestV2CdrsMysqlProcessPostpaidExternalCdrBenchmark(t *testing.T) { tStart := time.Now() nrCdrs := 1000 for i := 0; i < nrCdrs; i++ { - cdr.AccId = "benchpostpaidcdr" + strconv.Itoa(i) + cdr.OriginID = "benchpostpaidcdr" + strconv.Itoa(i) if err := cdrsRpc.Call("CdrsV2.ProcessExternalCdr", cdr, &reply); err != nil { t.Error("Unexpected error: ", err.Error()) } else if reply != utils.OK { diff --git a/apier/v2/cdrs_psql_local_test.go b/apier/v2/cdrs_psql_local_test.go index b02732245..d5c4baa1d 100644 --- a/apier/v2/cdrs_psql_local_test.go +++ b/apier/v2/cdrs_psql_local_test.go @@ -76,12 +76,12 @@ func TestV2CdrsPsqlInjectUnratedCdr(t *testing.T) { t.Error("Error on opening database connection: ", err) return } - strCdr1 := &engine.StoredCdr{CgrId: utils.Sha1("bbb1", time.Date(2015, 11, 21, 10, 47, 24, 0, time.UTC).String()), - TOR: utils.VOICE, AccId: "bbb1", CdrHost: "192.168.1.1", CdrSource: "UNKNOWN", ReqType: utils.META_RATED, + strCdr1 := &engine.CDR{CGRID: utils.Sha1("bbb1", time.Date(2015, 11, 21, 10, 47, 24, 0, time.UTC).String()), + TOR: utils.VOICE, OriginID: "bbb1", OriginHost: "192.168.1.1", Source: "UNKNOWN", ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002", SetupTime: time.Date(2015, 11, 21, 10, 47, 24, 0, time.UTC), AnswerTime: time.Date(2015, 11, 21, 10, 47, 26, 0, time.UTC), Usage: time.Duration(10) * time.Second, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, - MediationRunId: utils.DEFAULT_RUNID, Cost: 1.201} + RunID: utils.DEFAULT_RUNID, Cost: 1.201} if err := psqlDb.SetCdr(strCdr1); err != nil { t.Error(err.Error()) } @@ -115,24 +115,21 @@ func TestV2CdrsPsqlProcessCdr(t *testing.T) { return } var reply string - cdrs := []*engine.StoredCdr{ - &engine.StoredCdr{CgrId: utils.Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderId: 123, TOR: utils.VOICE, AccId: "dsafdsaf", - CdrHost: "192.168.1.1", CdrSource: "test", ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002", - SetupTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), MediationRunId: utils.DEFAULT_RUNID, - Usage: time.Duration(10) * time.Second, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, - RatedAccount: "dan", RatedSubject: "dans", Rated: true, + cdrs := []*engine.CDR{ + &engine.CDR{CGRID: utils.Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderID: 123, TOR: utils.VOICE, OriginID: "dsafdsaf", + OriginHost: "192.168.1.1", Source: "test", ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002", + SetupTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), RunID: utils.DEFAULT_RUNID, + Usage: time.Duration(10) * time.Second, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, Rated: true, }, - &engine.StoredCdr{CgrId: utils.Sha1("abcdeftg", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderId: 123, TOR: utils.VOICE, AccId: "dsafdsaf", - CdrHost: "192.168.1.1", CdrSource: "test", ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1002", Subject: "1002", Destination: "1002", - SetupTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), MediationRunId: utils.DEFAULT_RUNID, + &engine.CDR{CGRID: utils.Sha1("abcdeftg", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderID: 123, TOR: utils.VOICE, OriginID: "dsafdsaf", + OriginHost: "192.168.1.1", Source: "test", ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1002", Subject: "1002", Destination: "1002", + SetupTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), RunID: utils.DEFAULT_RUNID, Usage: time.Duration(10) * time.Second, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, - RatedAccount: "dan", RatedSubject: "dans", }, - &engine.StoredCdr{CgrId: utils.Sha1("aererfddf", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderId: 123, TOR: utils.VOICE, AccId: "dsafdsaf", - CdrHost: "192.168.1.1", CdrSource: "test", ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1003", Subject: "1003", Destination: "1002", - SetupTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), MediationRunId: utils.DEFAULT_RUNID, + &engine.CDR{CGRID: utils.Sha1("aererfddf", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderID: 123, TOR: utils.VOICE, OriginID: "dsafdsaf", + OriginHost: "192.168.1.1", Source: "test", ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1003", Subject: "1003", Destination: "1002", + SetupTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), RunID: utils.DEFAULT_RUNID, Usage: time.Duration(10) * time.Second, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, - RatedAccount: "dan", RatedSubject: "dans", }, } for _, cdr := range cdrs { @@ -148,36 +145,36 @@ func TestV2CdrsPsqlGetCdrs(t *testing.T) { if !*testLocal { return } - var reply []*engine.ExternalCdr - req := utils.RpcCdrsFilter{} + var reply []*engine.ExternalCDR + req := utils.RPCCDRsFilter{} if err := cdrsPsqlRpc.Call("ApierV2.GetCdrs", req, &reply); err != nil { t.Error("Unexpected error: ", err.Error()) } else if len(reply) != 4 { t.Error("Unexpected number of CDRs returned: ", len(reply)) } // CDRs with errors - req = utils.RpcCdrsFilter{MinCost: utils.Float64Pointer(-1.0), MaxCost: utils.Float64Pointer(0.0)} + req = utils.RPCCDRsFilter{MinCost: utils.Float64Pointer(-1.0), MaxCost: utils.Float64Pointer(0.0)} if err := cdrsPsqlRpc.Call("ApierV2.GetCdrs", req, &reply); err != nil { t.Error("Unexpected error: ", err.Error()) } else if len(reply) != 2 { t.Error("Unexpected number of CDRs returned: ", reply) } // CDRs Rated - req = utils.RpcCdrsFilter{MinCost: utils.Float64Pointer(-1.0)} + req = utils.RPCCDRsFilter{MinCost: utils.Float64Pointer(-1.0)} if err := cdrsPsqlRpc.Call("ApierV2.GetCdrs", req, &reply); err != nil { t.Error("Unexpected error: ", err.Error()) } else if len(reply) != 3 { t.Error("Unexpected number of CDRs returned: ", reply) } // CDRs non rated OR SkipRated - req = utils.RpcCdrsFilter{MaxCost: utils.Float64Pointer(-1.0)} + req = utils.RPCCDRsFilter{MaxCost: utils.Float64Pointer(-1.0)} if err := cdrsPsqlRpc.Call("ApierV2.GetCdrs", req, &reply); err != nil { t.Error("Unexpected error: ", err.Error()) } else if len(reply) != 1 { t.Error("Unexpected number of CDRs returned: ", reply) } // Skip Errors - req = utils.RpcCdrsFilter{MinCost: utils.Float64Pointer(0.0), MaxCost: utils.Float64Pointer(-1.0)} + req = utils.RPCCDRsFilter{MinCost: utils.Float64Pointer(0.0), MaxCost: utils.Float64Pointer(-1.0)} if err := cdrsPsqlRpc.Call("ApierV2.GetCdrs", req, &reply); err != nil { t.Error("Unexpected error: ", err.Error()) } else if len(reply) != 2 { @@ -204,24 +201,21 @@ func TestV2CdrsPsqlProcessPrepaidCdr(t *testing.T) { return } var reply string - cdrs := []*engine.StoredCdr{ - &engine.StoredCdr{CgrId: utils.Sha1("dsafdsaf2", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderId: 123, TOR: utils.VOICE, AccId: "dsafdsaf", - CdrHost: "192.168.1.1", CdrSource: "test", ReqType: utils.META_PREPAID, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002", - SetupTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), MediationRunId: utils.DEFAULT_RUNID, - Usage: time.Duration(10) * time.Second, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, - RatedAccount: "dan", RatedSubject: "dans", Rated: true, + cdrs := []*engine.CDR{ + &engine.CDR{CGRID: utils.Sha1("dsafdsaf2", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderID: 123, TOR: utils.VOICE, OriginID: "dsafdsaf", + OriginHost: "192.168.1.1", Source: "test", ReqType: utils.META_PREPAID, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002", + SetupTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), RunID: utils.DEFAULT_RUNID, + Usage: time.Duration(10) * time.Second, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, Rated: true, }, - &engine.StoredCdr{CgrId: utils.Sha1("abcdeftg2", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderId: 123, TOR: utils.VOICE, AccId: "dsafdsaf", - CdrHost: "192.168.1.1", CdrSource: "test", ReqType: utils.META_PREPAID, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1002", Subject: "1002", Destination: "1002", - SetupTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), MediationRunId: utils.DEFAULT_RUNID, + &engine.CDR{CGRID: utils.Sha1("abcdeftg2", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderID: 123, TOR: utils.VOICE, OriginID: "dsafdsaf", + OriginHost: "192.168.1.1", Source: "test", ReqType: utils.META_PREPAID, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1002", Subject: "1002", Destination: "1002", + SetupTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), RunID: utils.DEFAULT_RUNID, Usage: time.Duration(10) * time.Second, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, - RatedAccount: "dan", RatedSubject: "dans", }, - &engine.StoredCdr{CgrId: utils.Sha1("aererfddf2", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderId: 123, TOR: utils.VOICE, AccId: "dsafdsaf", - CdrHost: "192.168.1.1", CdrSource: "test", ReqType: utils.META_PREPAID, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1003", Subject: "1003", Destination: "1002", - SetupTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), MediationRunId: utils.DEFAULT_RUNID, + &engine.CDR{CGRID: utils.Sha1("aererfddf2", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderID: 123, TOR: utils.VOICE, OriginID: "dsafdsaf", + OriginHost: "192.168.1.1", Source: "test", ReqType: utils.META_PREPAID, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1003", Subject: "1003", Destination: "1002", + SetupTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), RunID: utils.DEFAULT_RUNID, Usage: time.Duration(10) * time.Second, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, - RatedAccount: "dan", RatedSubject: "dans", }, } tStart := time.Now() @@ -241,17 +235,17 @@ func TestV2CdrsPsqlRateWithoutTP(t *testing.T) { if !*testLocal { return } - rawCdrCgrId := utils.Sha1("bbb1", time.Date(2015, 11, 21, 10, 47, 24, 0, time.UTC).String()) + rawCdrCGRID := utils.Sha1("bbb1", time.Date(2015, 11, 21, 10, 47, 24, 0, time.UTC).String()) // Rate the injected CDR, should not rate it since we have no TP loaded - attrs := utils.AttrRateCdrs{CgrIds: []string{rawCdrCgrId}} + attrs := utils.AttrRateCdrs{CgrIds: []string{rawCdrCGRID}} var reply string if err := cdrsPsqlRpc.Call("CdrsV2.RateCdrs", attrs, &reply); err != nil { t.Error("Unexpected error: ", err.Error()) } else if reply != utils.OK { t.Error("Unexpected reply received: ", reply) } - var cdrs []*engine.ExternalCdr - req := utils.RpcCdrsFilter{CgrIds: []string{rawCdrCgrId}} + var cdrs []*engine.ExternalCDR + req := utils.RPCCDRsFilter{CGRIDs: []string{rawCdrCGRID}} if err := cdrsPsqlRpc.Call("ApierV2.GetCdrs", req, &cdrs); err != nil { t.Error("Unexpected error: ", err.Error()) } else if len(cdrs) != 1 { @@ -281,16 +275,16 @@ func TestV2CdrsPsqlRateWithTP(t *testing.T) { if !*testLocal { return } - rawCdrCgrId := utils.Sha1("bbb1", time.Date(2015, 11, 21, 10, 47, 24, 0, time.UTC).String()) - attrs := utils.AttrRateCdrs{CgrIds: []string{rawCdrCgrId}} + rawCdrCGRID := utils.Sha1("bbb1", time.Date(2015, 11, 21, 10, 47, 24, 0, time.UTC).String()) + attrs := utils.AttrRateCdrs{CgrIds: []string{rawCdrCGRID}} var reply string if err := cdrsPsqlRpc.Call("CdrsV2.RateCdrs", attrs, &reply); err != nil { t.Error("Unexpected error: ", err.Error()) } else if reply != utils.OK { t.Error("Unexpected reply received: ", reply) } - var cdrs []*engine.ExternalCdr - req := utils.RpcCdrsFilter{CgrIds: []string{rawCdrCgrId}} + var cdrs []*engine.ExternalCDR + req := utils.RPCCDRsFilter{CGRIDs: []string{rawCdrCGRID}} if err := cdrsPsqlRpc.Call("ApierV2.GetCdrs", req, &cdrs); err != nil { t.Error("Unexpected error: ", err.Error()) } else if len(cdrs) != 1 { @@ -308,8 +302,8 @@ func TestV2CdrsPsqlProcessRatedExternalCdrBenchmark(t *testing.T) { if !*testLocal { return } - cdr := &engine.ExternalCdr{TOR: utils.VOICE, - AccId: "benchratedcdr", CdrHost: "192.168.1.1", CdrSource: utils.UNIT_TEST, ReqType: utils.META_RATED, Direction: utils.OUT, + cdr := &engine.ExternalCDR{TOR: utils.VOICE, + OriginID: "benchratedcdr", OriginHost: "192.168.1.1", Source: utils.UNIT_TEST, ReqType: utils.META_RATED, Direction: utils.OUT, Tenant: "cgrates.org", Category: "call", Account: "1003", Subject: "1003", Destination: "1001", Supplier: "SUPPL1", SetupTime: "2014-08-04T13:00:00Z", AnswerTime: "2014-08-04T13:00:07Z", Usage: "15", Pdd: "7.0", ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, @@ -318,7 +312,7 @@ func TestV2CdrsPsqlProcessRatedExternalCdrBenchmark(t *testing.T) { tStart := time.Now() nrCdrs := 1000 for i := 0; i < nrCdrs; i++ { - cdr.AccId = "benchratedcdr" + strconv.Itoa(i) + cdr.OriginID = "benchratedcdr" + strconv.Itoa(i) if err := cdrsPsqlRpc.Call("CdrsV2.ProcessExternalCdr", cdr, &reply); err != nil { t.Error("Unexpected error: ", err.Error()) } else if reply != utils.OK { @@ -357,8 +351,8 @@ func TestV2CdrsPsqlProcessPostpaidExternalCdrBenchmark(t *testing.T) { if !*testLocal { return } - cdr := &engine.ExternalCdr{TOR: utils.VOICE, - AccId: "benchpostpaidcdr", CdrHost: "192.168.1.1", CdrSource: utils.UNIT_TEST, ReqType: utils.META_POSTPAID, Direction: utils.OUT, + cdr := &engine.ExternalCDR{TOR: utils.VOICE, + OriginID: "benchpostpaidcdr", OriginHost: "192.168.1.1", Source: utils.UNIT_TEST, ReqType: utils.META_POSTPAID, Direction: utils.OUT, Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002", Supplier: "SUPPL1", SetupTime: "2014-08-04T13:00:00Z", AnswerTime: "2014-08-04T13:00:07Z", Usage: "15", Pdd: "7.0", ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, @@ -367,7 +361,7 @@ func TestV2CdrsPsqlProcessPostpaidExternalCdrBenchmark(t *testing.T) { tStart := time.Now() nrCdrs := 1000 for i := 0; i < nrCdrs; i++ { - cdr.AccId = "benchpostpaidcdr" + strconv.Itoa(i) + cdr.OriginID = "benchpostpaidcdr" + strconv.Itoa(i) if err := cdrsPsqlRpc.Call("CdrsV2.ProcessExternalCdr", cdr, &reply); err != nil { t.Error("Unexpected error: ", err.Error()) } else if reply != utils.OK { diff --git a/cdrc/cdrc.go b/cdrc/cdrc.go index f91663678..3b3b0656e 100644 --- a/cdrc/cdrc.go +++ b/cdrc/cdrc.go @@ -43,7 +43,7 @@ const ( // Understands and processes a specific format of cdr (eg: .csv or .fwv) type RecordsProcessor interface { - ProcessNextRecord() ([]*engine.StoredCdr, error) // Process a single record in the CDR file, return a slice of CDRs since based on configuration we can have more templates + ProcessNextRecord() ([]*engine.CDR, error) // Process a single record in the CDR file, return a slice of CDRs since based on configuration we can have more templates ProcessedRecordsNr() int64 } diff --git a/cdrc/csv.go b/cdrc/csv.go index 66d5971d5..1d668e17a 100644 --- a/cdrc/csv.go +++ b/cdrc/csv.go @@ -37,7 +37,7 @@ func NewPartialFlatstoreRecord(record []string, timezone string) (*PartialFlatst if len(record) < 7 { return nil, errors.New("MISSING_IE") } - pr := &PartialFlatstoreRecord{Method: record[0], AccId: record[3] + record[1] + record[2], Values: record} + pr := &PartialFlatstoreRecord{Method: record[0], OriginID: record[3] + record[1] + record[2], Values: record} var err error if pr.Timestamp, err = utils.ParseTimeDetectLayout(record[6], timezone); err != nil { return nil, err @@ -48,7 +48,7 @@ func NewPartialFlatstoreRecord(record []string, timezone string) (*PartialFlatst // This is a partial record received from Flatstore, can be INVITE or BYE and it needs to be paired in order to produce duration type PartialFlatstoreRecord struct { Method string // INVITE or BYE - AccId string // Copute here the AccId + OriginID string // Copute here the OriginID Timestamp time.Time // Timestamp of the event, as written by db_flastore module Values []string // Can contain original values or updated via UpdateValues } @@ -100,7 +100,7 @@ type PartialRecordsCache struct { ttl time.Duration cdrOutDir string csvSep rune - partialRecords map[string]map[string]*PartialFlatstoreRecord // [FileName"][AccId]*PartialRecord + partialRecords map[string]map[string]*PartialFlatstoreRecord // [FileName"][OriginID]*PartialRecord guard *engine.GuardianLock } @@ -131,7 +131,7 @@ func (self *PartialRecordsCache) dumpUnpairedRecords(fileName string) error { } // Search in cache and return the partial record with accountind id defined, prefFilename is searched at beginning because of better match probability -func (self *PartialRecordsCache) GetPartialRecord(accId, prefFileName string) (string, *PartialFlatstoreRecord) { +func (self *PartialRecordsCache) GetPartialRecord(OriginID, prefFileName string) (string, *PartialFlatstoreRecord) { var cachedFilename string var cachedPartial *PartialFlatstoreRecord checkCachedFNames := []string{prefFileName} // Higher probability to match as firstFileName @@ -143,7 +143,7 @@ func (self *PartialRecordsCache) GetPartialRecord(accId, prefFileName string) (s for _, fName := range checkCachedFNames { // Need to lock them individually self.guard.Guard(func() (interface{}, error) { var hasPartial bool - if cachedPartial, hasPartial = self.partialRecords[fName][accId]; hasPartial { + if cachedPartial, hasPartial = self.partialRecords[fName][OriginID]; hasPartial { cachedFilename = fName } return nil, nil @@ -158,15 +158,15 @@ func (self *PartialRecordsCache) GetPartialRecord(accId, prefFileName string) (s func (self *PartialRecordsCache) CachePartial(fileName string, pr *PartialFlatstoreRecord) { self.guard.Guard(func() (interface{}, error) { if fileMp, hasFile := self.partialRecords[fileName]; !hasFile { - self.partialRecords[fileName] = map[string]*PartialFlatstoreRecord{pr.AccId: pr} + self.partialRecords[fileName] = map[string]*PartialFlatstoreRecord{pr.OriginID: pr} if self.ttl != 0 { // Schedule expiry/dump of the just created entry in cache go func() { time.Sleep(self.ttl) self.dumpUnpairedRecords(fileName) }() } - } else if _, hasAccId := fileMp[pr.AccId]; !hasAccId { - self.partialRecords[fileName][pr.AccId] = pr + } else if _, hasOriginID := fileMp[pr.OriginID]; !hasOriginID { + self.partialRecords[fileName][pr.OriginID] = pr } return nil, nil }, 0, fileName) @@ -174,7 +174,7 @@ func (self *PartialRecordsCache) CachePartial(fileName string, pr *PartialFlatst func (self *PartialRecordsCache) UncachePartial(fileName string, pr *PartialFlatstoreRecord) { self.guard.Guard(func() (interface{}, error) { - delete(self.partialRecords[fileName], pr.AccId) // Remove the record out of cache + delete(self.partialRecords[fileName], pr.OriginID) // Remove the record out of cache return nil, nil }, 0, fileName) } @@ -203,7 +203,7 @@ func (self *CsvRecordsProcessor) ProcessedRecordsNr() int64 { return self.processedRecordsNr } -func (self *CsvRecordsProcessor) ProcessNextRecord() ([]*engine.StoredCdr, error) { +func (self *CsvRecordsProcessor) ProcessNextRecord() ([]*engine.CDR, error) { record, err := self.csvReader.Read() if err != nil { return nil, err @@ -231,7 +231,7 @@ func (self *CsvRecordsProcessor) processPartialRecord(record []string) ([]string return nil, err } // Retrieve and complete the record from cache - cachedFilename, cachedPartial := self.partialRecordsCache.GetPartialRecord(pr.AccId, self.fileName) + cachedFilename, cachedPartial := self.partialRecordsCache.GetPartialRecord(pr.OriginID, self.fileName) if cachedPartial == nil { // Not cached, do it here and stop processing self.partialRecordsCache.CachePartial(self.fileName, pr) return nil, nil @@ -245,8 +245,8 @@ func (self *CsvRecordsProcessor) processPartialRecord(record []string) ([]string } // Takes the record from a slice and turns it into StoredCdrs, posting them to the cdrServer -func (self *CsvRecordsProcessor) processRecord(record []string) ([]*engine.StoredCdr, error) { - recordCdrs := make([]*engine.StoredCdr, 0) // More CDRs based on the number of filters and field templates +func (self *CsvRecordsProcessor) processRecord(record []string) ([]*engine.CDR, error) { + recordCdrs := make([]*engine.CDR, 0) // More CDRs based on the number of filters and field templates for cdrcId, cdrcCfg := range self.cdrcCfgs { // cdrFields coming from more templates will produce individual storCdr records // Make sure filters are matching filterBreak := false @@ -277,8 +277,8 @@ func (self *CsvRecordsProcessor) processRecord(record []string) ([]*engine.Store } // Takes the record out of csv and turns it into storedCdr which can be processed by CDRS -func (self *CsvRecordsProcessor) recordToStoredCdr(record []string, cdrcId string) (*engine.StoredCdr, error) { - storedCdr := &engine.StoredCdr{CdrHost: "0.0.0.0", CdrSource: self.cdrcCfgs[cdrcId].CdrSourceId, ExtraFields: make(map[string]string), Cost: -1} +func (self *CsvRecordsProcessor) recordToStoredCdr(record []string, cdrcId string) (*engine.CDR, error) { + storedCdr := &engine.CDR{OriginHost: "0.0.0.0", Source: self.cdrcCfgs[cdrcId].CdrSourceId, ExtraFields: make(map[string]string), Cost: -1} var err error var lazyHttpFields []*config.CfgCdrField for _, cdrFldCfg := range self.cdrcCfgs[cdrcId].ContentFields { @@ -313,7 +313,7 @@ func (self *CsvRecordsProcessor) recordToStoredCdr(record []string, cdrcId strin return nil, err } } - storedCdr.CgrId = utils.Sha1(storedCdr.AccId, storedCdr.SetupTime.UTC().String()) + storedCdr.CGRID = utils.Sha1(storedCdr.OriginID, storedCdr.SetupTime.UTC().String()) if storedCdr.TOR == utils.DATA && self.cdrcCfgs[cdrcId].DataUsageMultiplyFactor != 0 { storedCdr.Usage = time.Duration(float64(storedCdr.Usage.Nanoseconds()) * self.cdrcCfgs[cdrcId].DataUsageMultiplyFactor) } diff --git a/cdrc/csv_test.go b/cdrc/csv_test.go index 286eb0457..d96d2bc42 100644 --- a/cdrc/csv_test.go +++ b/cdrc/csv_test.go @@ -48,12 +48,12 @@ func TestCsvRecordForkCdr(t *testing.T) { if err != nil { t.Error("Failed to parse CDR in rated cdr", err) } - expectedCdr := &engine.StoredCdr{ - CgrId: utils.Sha1(cdrRow[3], time.Date(2013, 2, 3, 19, 50, 0, 0, time.UTC).String()), + expectedCdr := &engine.CDR{ + CGRID: utils.Sha1(cdrRow[3], time.Date(2013, 2, 3, 19, 50, 0, 0, time.UTC).String()), TOR: cdrRow[2], - AccId: cdrRow[3], - CdrHost: "0.0.0.0", // Got it over internal interface - CdrSource: "TEST_CDRC", + OriginID: cdrRow[3], + OriginHost: "0.0.0.0", // Got it over internal interface + Source: "TEST_CDRC", ReqType: cdrRow[4], Direction: cdrRow[5], Tenant: cdrRow[6], @@ -88,11 +88,11 @@ func TestCsvDataMultiplyFactor(t *testing.T) { t.Error("Failed to parse CDR in rated cdr", err) } var sTime time.Time - expectedCdr := &engine.StoredCdr{ - CgrId: utils.Sha1("", sTime.String()), + expectedCdr := &engine.CDR{ + CGRID: utils.Sha1("", sTime.String()), TOR: cdrRow[0], - CdrHost: "0.0.0.0", - CdrSource: "TEST_CDRC", + OriginHost: "0.0.0.0", + Source: "TEST_CDRC", Usage: time.Duration(1) * time.Second, ExtraFields: map[string]string{}, Cost: -1, @@ -101,11 +101,11 @@ func TestCsvDataMultiplyFactor(t *testing.T) { t.Errorf("Expected: \n%v, \nreceived: \n%v", expectedCdr, rtCdr) } csvProcessor.cdrcCfgs["*default"].DataUsageMultiplyFactor = 1024 - expectedCdr = &engine.StoredCdr{ - CgrId: utils.Sha1("", sTime.String()), + expectedCdr = &engine.CDR{ + CGRID: utils.Sha1("", sTime.String()), TOR: cdrRow[0], - CdrHost: "0.0.0.0", - CdrSource: "TEST_CDRC", + OriginHost: "0.0.0.0", + Source: "TEST_CDRC", Usage: time.Duration(1024) * time.Second, ExtraFields: map[string]string{}, Cost: -1, @@ -114,11 +114,11 @@ func TestCsvDataMultiplyFactor(t *testing.T) { t.Errorf("Expected: \n%v, \nreceived: \n%v", expectedCdr, rtCdr) } cdrRow = []string{"*voice", "1"} - expectedCdr = &engine.StoredCdr{ - CgrId: utils.Sha1("", sTime.String()), + expectedCdr = &engine.CDR{ + CGRID: utils.Sha1("", sTime.String()), TOR: cdrRow[0], - CdrHost: "0.0.0.0", - CdrSource: "TEST_CDRC", + OriginHost: "0.0.0.0", + Source: "TEST_CDRC", Usage: time.Duration(1) * time.Second, ExtraFields: map[string]string{}, Cost: -1, diff --git a/cdrc/fwv.go b/cdrc/fwv.go index ddb84241f..1b65415ff 100644 --- a/cdrc/fwv.go +++ b/cdrc/fwv.go @@ -58,11 +58,11 @@ type FwvRecordsProcessor struct { httpClient *http.Client httpSkipTlsCheck bool timezone string - lineLen int64 // Length of the line in the file - offset int64 // Index of the next byte to process - processedRecordsNr int64 // Number of content records in file - trailerOffset int64 // Index where trailer starts, to be used as boundary when reading cdrs - headerCdr *engine.StoredCdr // Cache here the general purpose stored CDR + lineLen int64 // Length of the line in the file + offset int64 // Index of the next byte to process + processedRecordsNr int64 // Number of content records in file + trailerOffset int64 // Index where trailer starts, to be used as boundary when reading cdrs + headerCdr *engine.CDR // Cache here the general purpose stored CDR } // Sets the line length based on first line, sets offset back to initial after reading @@ -83,7 +83,7 @@ func (self *FwvRecordsProcessor) ProcessedRecordsNr() int64 { return self.processedRecordsNr } -func (self *FwvRecordsProcessor) ProcessNextRecord() ([]*engine.StoredCdr, error) { +func (self *FwvRecordsProcessor) ProcessNextRecord() ([]*engine.CDR, error) { defer func() { self.offset += self.lineLen }() // Schedule increasing the offset once we are out from processing the record if self.offset == 0 { // First time, set the necessary offsets if err := self.setLineLen(); err != nil { @@ -106,7 +106,7 @@ func (self *FwvRecordsProcessor) ProcessNextRecord() ([]*engine.StoredCdr, error return nil, nil } } - recordCdrs := make([]*engine.StoredCdr, 0) // More CDRs based on the number of filters and field templates + recordCdrs := make([]*engine.CDR, 0) // More CDRs based on the number of filters and field templates if self.trailerOffset != 0 && self.offset >= self.trailerOffset { if err := self.processTrailer(); err != nil && err != io.EOF { utils.Logger.Err(fmt.Sprintf(" Read trailer error: %s ", err.Error())) @@ -157,24 +157,24 @@ func (self *FwvRecordsProcessor) recordPassesCfgFilter(record, configKey string) } // Converts a record (header or normal) to StoredCdr -func (self *FwvRecordsProcessor) recordToStoredCdr(record string, cfgKey string) (*engine.StoredCdr, error) { +func (self *FwvRecordsProcessor) recordToStoredCdr(record string, cfgKey string) (*engine.CDR, error) { var err error var lazyHttpFields []*config.CfgCdrField var cfgFields []*config.CfgCdrField var duMultiplyFactor float64 - var storedCdr *engine.StoredCdr + var storedCdr *engine.CDR if self.headerCdr != nil { // Clone the header CDR so we can use it as base to future processing (inherit fields defined there) storedCdr = self.headerCdr.Clone() } else { - storedCdr = &engine.StoredCdr{CdrHost: "0.0.0.0", ExtraFields: make(map[string]string), Cost: -1} + storedCdr = &engine.CDR{OriginHost: "0.0.0.0", ExtraFields: make(map[string]string), Cost: -1} } if cfgKey == "*header" { cfgFields = self.dfltCfg.HeaderFields - storedCdr.CdrSource = self.dfltCfg.CdrSourceId + storedCdr.Source = self.dfltCfg.CdrSourceId duMultiplyFactor = self.dfltCfg.DataUsageMultiplyFactor } else { cfgFields = self.cdrcCfgs[cfgKey].ContentFields - storedCdr.CdrSource = self.cdrcCfgs[cfgKey].CdrSourceId + storedCdr.Source = self.cdrcCfgs[cfgKey].CdrSourceId duMultiplyFactor = self.cdrcCfgs[cfgKey].DataUsageMultiplyFactor } for _, cdrFldCfg := range cfgFields { @@ -202,8 +202,8 @@ func (self *FwvRecordsProcessor) recordToStoredCdr(record string, cfgKey string) return nil, err } } - if storedCdr.CgrId == "" && storedCdr.AccId != "" && cfgKey != "*header" { - storedCdr.CgrId = utils.Sha1(storedCdr.AccId, storedCdr.SetupTime.UTC().String()) + if storedCdr.CGRID == "" && storedCdr.OriginID != "" && cfgKey != "*header" { + storedCdr.CGRID = utils.Sha1(storedCdr.OriginID, storedCdr.SetupTime.UTC().String()) } if storedCdr.TOR == utils.DATA && duMultiplyFactor != 0 { storedCdr.Usage = time.Duration(float64(storedCdr.Usage.Nanoseconds()) * duMultiplyFactor) diff --git a/cdre/cdrexporter.go b/cdre/cdrexporter.go index 0e9fddc81..61f2f29c0 100644 --- a/cdre/cdrexporter.go +++ b/cdre/cdrexporter.go @@ -52,7 +52,7 @@ const ( var err error -func NewCdrExporter(cdrs []*engine.StoredCdr, cdrDb engine.CdrStorage, exportTpl *config.CdreConfig, cdrFormat string, fieldSeparator rune, exportId string, +func NewCdrExporter(cdrs []*engine.CDR, cdrDb engine.CdrStorage, exportTpl *config.CdreConfig, cdrFormat string, fieldSeparator rune, exportId string, dataUsageMultiplyFactor, smsUsageMultiplyFactor, genericUsageMultiplyFactor, costMultiplyFactor float64, costShiftDigits, roundDecimals, cgrPrecision int, maskDestId string, maskLen int, httpSkipTlsCheck bool, timezone string) (*CdrExporter, error) { if len(cdrs) == 0 { // Nothing to export @@ -84,7 +84,7 @@ func NewCdrExporter(cdrs []*engine.StoredCdr, cdrDb engine.CdrStorage, exportTpl } type CdrExporter struct { - cdrs []*engine.StoredCdr + cdrs []*engine.CDR cdrDb engine.CdrStorage // Used to extract cost_details if these are requested exportTemplate *config.CdreConfig cdrFormat string // csv, fwv @@ -107,14 +107,14 @@ type CdrExporter struct { totalCost float64 firstExpOrderId, lastExpOrderId int64 - positiveExports []string // CGRIds of successfully exported CDRs - negativeExports map[string]string // CgrIds of failed exports + positiveExports []string // CGRIDs of successfully exported CDRs + negativeExports map[string]string // CGRIDs of failed exports } // Return Json marshaled callCost attached to // Keep it separately so we test only this part in local tests -func (cdre *CdrExporter) getCdrCostDetails(cgrId, runId string) (string, error) { - cc, err := cdre.cdrDb.GetCallCostLog(cgrId, "", runId) +func (cdre *CdrExporter) getCdrCostDetails(CGRID, runId string) (string, error) { + cc, err := cdre.cdrDb.GetCallCostLog(CGRID, "", runId) if err != nil { return "", err } else if cc == nil { @@ -124,7 +124,7 @@ func (cdre *CdrExporter) getCdrCostDetails(cgrId, runId string) (string, error) return string(ccJson), nil } -func (cdre *CdrExporter) getCombimedCdrFieldVal(processedCdr *engine.StoredCdr, cfgCdrFld *config.CfgCdrField) (string, error) { +func (cdre *CdrExporter) getCombimedCdrFieldVal(processedCdr *engine.CDR, cfgCdrFld *config.CfgCdrField) (string, error) { var combinedVal string // Will result as combination of the field values, filters must match for _, filterRule := range cfgCdrFld.FieldFilter { fltrPass, ftrPassValue := processedCdr.PassesFieldFilter(filterRule) @@ -132,7 +132,7 @@ func (cdre *CdrExporter) getCombimedCdrFieldVal(processedCdr *engine.StoredCdr, return "", nil } for _, cdr := range cdre.cdrs { - if cdr.CgrId != processedCdr.CgrId { + if cdr.CGRID != processedCdr.CGRID { continue // We only care about cdrs with same primary cdr behind } if cdr.FieldAsString(&utils.RSRField{Id: filterRule.Id}) == ftrPassValue { // First CDR with filte @@ -153,7 +153,7 @@ func (cdre *CdrExporter) maskedDestination(destination string) bool { return false } -func (cdre *CdrExporter) getDateTimeFieldVal(cdr *engine.StoredCdr, cfgCdrFld *config.CfgCdrField) (string, error) { +func (cdre *CdrExporter) getDateTimeFieldVal(cdr *engine.CDR, cfgCdrFld *config.CfgCdrField) (string, error) { if len(cfgCdrFld.Value) == 0 { return "", nil } @@ -174,7 +174,7 @@ func (cdre *CdrExporter) getDateTimeFieldVal(cdr *engine.StoredCdr, cfgCdrFld *c } // Extracts the value specified by cfgHdr out of cdr -func (cdre *CdrExporter) cdrFieldValue(cdr *engine.StoredCdr, cfgCdrFld *config.CfgCdrField) (string, error) { +func (cdre *CdrExporter) cdrFieldValue(cdr *engine.CDR, cfgCdrFld *config.CfgCdrField) (string, error) { for _, fltrRl := range cfgCdrFld.FieldFilter { if fltrPass, _ := cdr.PassesFieldFilter(fltrRl); !fltrPass { return "", fmt.Errorf("Field: %s not matching filter rule %v", fltrRl.Id, fltrRl) @@ -189,7 +189,7 @@ func (cdre *CdrExporter) cdrFieldValue(cdr *engine.StoredCdr, cfgCdrFld *config. var cdrVal string switch rsrFld.Id { case COST_DETAILS: // Special case when we need to further extract cost_details out of logDb - if cdr.ExtraFields[COST_DETAILS], err = cdre.getCdrCostDetails(cdr.CgrId, cdr.MediationRunId); err != nil { + if cdr.ExtraFields[COST_DETAILS], err = cdre.getCdrCostDetails(cdr.CGRID, cdr.RunID); err != nil { return "", err } else { cdrVal = cdr.FieldAsString(rsrFld) @@ -229,16 +229,16 @@ func (cdre *CdrExporter) metaHandler(tag, arg string) (string, error) { case META_NRCDRS: return strconv.Itoa(cdre.numberOfRecords), nil case META_DURCDRS: - emulatedCdr := &engine.StoredCdr{TOR: utils.VOICE, Usage: cdre.totalDuration} + emulatedCdr := &engine.CDR{TOR: utils.VOICE, Usage: cdre.totalDuration} return emulatedCdr.FormatUsage(arg), nil case META_SMSUSAGE: - emulatedCdr := &engine.StoredCdr{TOR: utils.SMS, Usage: cdre.totalSmsUsage} + emulatedCdr := &engine.CDR{TOR: utils.SMS, Usage: cdre.totalSmsUsage} return emulatedCdr.FormatUsage(arg), nil case META_GENERICUSAGE: - emulatedCdr := &engine.StoredCdr{TOR: utils.GENERIC, Usage: cdre.totalGenericUsage} + emulatedCdr := &engine.CDR{TOR: utils.GENERIC, Usage: cdre.totalGenericUsage} return emulatedCdr.FormatUsage(arg), nil case META_DATAUSAGE: - emulatedCdr := &engine.StoredCdr{TOR: utils.DATA, Usage: cdre.totalDataUsage} + emulatedCdr := &engine.CDR{TOR: utils.DATA, Usage: cdre.totalDataUsage} return emulatedCdr.FormatUsage(arg), nil case META_COSTCDRS: return strconv.FormatFloat(utils.Round(cdre.totalCost, cdre.roundDecimals, utils.ROUNDING_MIDDLE), 'f', -1, 64), nil @@ -311,8 +311,8 @@ func (cdre *CdrExporter) composeTrailer() error { } // Write individual cdr into content buffer, build stats -func (cdre *CdrExporter) processCdr(cdr *engine.StoredCdr) error { - if cdr == nil || len(cdr.CgrId) == 0 { // We do not export empty CDRs +func (cdre *CdrExporter) processCdr(cdr *engine.CDR) error { + if cdr == nil || len(cdr.CGRID) == 0 { // We do not export empty CDRs return nil } else if cdr.ExtraFields == nil { // Avoid assignment in nil map if not initialized cdr.ExtraFields = make(map[string]string) @@ -363,12 +363,12 @@ func (cdre *CdrExporter) processCdr(cdr *engine.StoredCdr) error { } } if err != nil { - utils.Logger.Err(fmt.Sprintf(" Cannot export CDR with cgrid: %s and runid: %s, error: %s", cdr.CgrId, cdr.MediationRunId, err.Error())) + utils.Logger.Err(fmt.Sprintf(" Cannot export CDR with CGRID: %s and runid: %s, error: %s", cdr.CGRID, cdr.RunID, err.Error())) return err } fmtOut := outVal if fmtOut, err = utils.FmtFieldWidth(outVal, cfgFld.Width, cfgFld.Strip, cfgFld.Padding, cfgFld.Mandatory); err != nil { - utils.Logger.Err(fmt.Sprintf(" Cannot export CDR with cgrid: %s, runid: %s, fieldName: %s, fieldValue: %s, error: %s", cdr.CgrId, cdr.MediationRunId, cfgFld.Tag, outVal, err.Error())) + utils.Logger.Err(fmt.Sprintf(" Cannot export CDR with CGRID: %s, runid: %s, fieldName: %s, fieldValue: %s, error: %s", cdr.CGRID, cdr.RunID, cfgFld.Tag, outVal, err.Error())) return err } cdrRow[idx] += fmtOut @@ -402,11 +402,11 @@ func (cdre *CdrExporter) processCdr(cdr *engine.StoredCdr) error { cdre.totalCost += cdr.Cost cdre.totalCost = utils.Round(cdre.totalCost, cdre.roundDecimals, utils.ROUNDING_MIDDLE) } - if cdre.firstExpOrderId > cdr.OrderId || cdre.firstExpOrderId == 0 { - cdre.firstExpOrderId = cdr.OrderId + if cdre.firstExpOrderId > cdr.OrderID || cdre.firstExpOrderId == 0 { + cdre.firstExpOrderId = cdr.OrderID } - if cdre.lastExpOrderId < cdr.OrderId { - cdre.lastExpOrderId = cdr.OrderId + if cdre.lastExpOrderId < cdr.OrderID { + cdre.lastExpOrderId = cdr.OrderID } return nil } @@ -415,9 +415,9 @@ func (cdre *CdrExporter) processCdr(cdr *engine.StoredCdr) error { func (cdre *CdrExporter) processCdrs() error { for _, cdr := range cdre.cdrs { if err := cdre.processCdr(cdr); err != nil { - cdre.negativeExports[cdr.CgrId] = err.Error() + cdre.negativeExports[cdr.CGRID] = err.Error() } else { - cdre.positiveExports = append(cdre.positiveExports, cdr.CgrId) + cdre.positiveExports = append(cdre.positiveExports, cdr.CGRID) } } // Process header and trailer after processing cdrs since the metatag functions can access stats out of built cdrs @@ -524,12 +524,12 @@ func (cdre *CdrExporter) TotalExportedCdrs() int { return cdre.numberOfRecords } -// Return successfully exported CgrIds +// Return successfully exported CGRIDs func (cdre *CdrExporter) PositiveExports() []string { return cdre.positiveExports } -// Return failed exported CgrIds together with the reason +// Return failed exported CGRIDs together with the reason func (cdre *CdrExporter) NegativeExports() map[string]string { return cdre.negativeExports } diff --git a/cdre/cdrexporter_test.go b/cdre/cdrexporter_test.go index a2f7f2763..1025466de 100644 --- a/cdre/cdrexporter_test.go +++ b/cdre/cdrexporter_test.go @@ -29,34 +29,34 @@ import ( func TestCdreGetCombimedCdrFieldVal(t *testing.T) { cfg, _ := config.NewDefaultCGRConfig() - cdrs := []*engine.StoredCdr{ - &engine.StoredCdr{CgrId: utils.Sha1("dsafdsaf", time.Unix(1383813745, 0).UTC().String()), TOR: utils.VOICE, AccId: "dsafdsaf", CdrHost: "192.168.1.1", + cdrs := []*engine.CDR{ + &engine.CDR{CGRID: utils.Sha1("dsafdsaf", time.Unix(1383813745, 0).UTC().String()), TOR: utils.VOICE, OriginID: "dsafdsaf", OriginHost: "192.168.1.1", ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002", SetupTime: time.Unix(1383813745, 0).UTC(), AnswerTime: time.Unix(1383813746, 0).UTC(), - Usage: time.Duration(10) * time.Second, MediationRunId: "RUN_RTL", Cost: 1.01}, - &engine.StoredCdr{CgrId: utils.Sha1("dsafdsaf2", time.Unix(1383813745, 0).UTC().String()), TOR: utils.VOICE, AccId: "dsafdsaf", CdrHost: "192.168.1.1", + Usage: time.Duration(10) * time.Second, RunID: "RUN_RTL", Cost: 1.01}, + &engine.CDR{CGRID: utils.Sha1("dsafdsaf2", time.Unix(1383813745, 0).UTC().String()), TOR: utils.VOICE, OriginID: "dsafdsaf", OriginHost: "192.168.1.1", ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002", SetupTime: time.Unix(1383813745, 0).UTC(), AnswerTime: time.Unix(1383813746, 0).UTC(), - Usage: time.Duration(10) * time.Second, MediationRunId: "CUSTOMER1", Cost: 2.01}, - &engine.StoredCdr{CgrId: utils.Sha1("dsafdsaf", time.Unix(1383813745, 0).UTC().String()), TOR: utils.VOICE, AccId: "dsafdsaf", CdrHost: "192.168.1.1", + Usage: time.Duration(10) * time.Second, RunID: "CUSTOMER1", Cost: 2.01}, + &engine.CDR{CGRID: utils.Sha1("dsafdsaf", time.Unix(1383813745, 0).UTC().String()), TOR: utils.VOICE, OriginID: "dsafdsaf", OriginHost: "192.168.1.1", ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002", SetupTime: time.Unix(1383813745, 0).UTC(), AnswerTime: time.Unix(1383813746, 0).UTC(), - Usage: time.Duration(10) * time.Second, MediationRunId: "CUSTOMER1", Cost: 3.01}, - &engine.StoredCdr{CgrId: utils.Sha1("dsafdsaf", time.Unix(1383813745, 0).UTC().String()), TOR: utils.VOICE, AccId: "dsafdsaf", CdrHost: "192.168.1.1", + Usage: time.Duration(10) * time.Second, RunID: "CUSTOMER1", Cost: 3.01}, + &engine.CDR{CGRID: utils.Sha1("dsafdsaf", time.Unix(1383813745, 0).UTC().String()), TOR: utils.VOICE, OriginID: "dsafdsaf", OriginHost: "192.168.1.1", ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002", SetupTime: time.Unix(1383813745, 0).UTC(), AnswerTime: time.Unix(1383813746, 0).UTC(), - Usage: time.Duration(10) * time.Second, MediationRunId: utils.DEFAULT_RUNID, Cost: 4.01}, - &engine.StoredCdr{CgrId: utils.Sha1("dsafdsaf", time.Unix(1383813745, 0).UTC().String()), TOR: utils.VOICE, AccId: "dsafdsaf", CdrHost: "192.168.1.1", + Usage: time.Duration(10) * time.Second, RunID: utils.DEFAULT_RUNID, Cost: 4.01}, + &engine.CDR{CGRID: utils.Sha1("dsafdsaf", time.Unix(1383813745, 0).UTC().String()), TOR: utils.VOICE, OriginID: "dsafdsaf", OriginHost: "192.168.1.1", ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1000", Subject: "1001", Destination: "1002", SetupTime: time.Unix(1383813745, 0).UTC(), AnswerTime: time.Unix(1383813746, 0).UTC(), - Usage: time.Duration(10) * time.Second, MediationRunId: "RETAIL1", Cost: 5.01}, + Usage: time.Duration(10) * time.Second, RunID: "RETAIL1", Cost: 5.01}, } cdre, err := NewCdrExporter(cdrs, nil, cfg.CdreProfiles["*default"], cfg.CdreProfiles["*default"].CdrFormat, cfg.CdreProfiles["*default"].FieldSeparator, "firstexport", 0.0, 0.0, 0.0, 0.0, 0, 4, cfg.RoundingDecimals, "", 0, cfg.HttpSkipTlsVerify, "") if err != nil { t.Error("Unexpected error received: ", err) } - fltrRule, _ := utils.ParseRSRFields("~MediationRunId:s/default/RUN_RTL/", utils.INFIELD_SEP) + fltrRule, _ := utils.ParseRSRFields("~RunID:s/default/RUN_RTL/", utils.INFIELD_SEP) val, _ := utils.ParseRSRFields(utils.COST, utils.INFIELD_SEP) cfgCdrFld := &config.CfgCdrField{Tag: "cost", Type: "cdrfield", FieldId: utils.COST, Value: val, FieldFilter: fltrRule} if costVal, err := cdre.getCombimedCdrFieldVal(cdrs[3], cfgCdrFld); err != nil { @@ -64,7 +64,7 @@ func TestCdreGetCombimedCdrFieldVal(t *testing.T) { } else if costVal != "1.01" { t.Error("Expecting: 1.01, received: ", costVal) } - fltrRule, _ = utils.ParseRSRFields("~MediationRunId:s/default/RETAIL1/", utils.INFIELD_SEP) + fltrRule, _ = utils.ParseRSRFields("~RunID:s/default/RETAIL1/", utils.INFIELD_SEP) val, _ = utils.ParseRSRFields(utils.ACCOUNT, utils.INFIELD_SEP) cfgCdrFld = &config.CfgCdrField{Tag: utils.ACCOUNT, Type: "cdrfield", FieldId: utils.ACCOUNT, Value: val, FieldFilter: fltrRule} if acntVal, err := cdre.getCombimedCdrFieldVal(cdrs[3], cfgCdrFld); err != nil { @@ -76,10 +76,10 @@ func TestCdreGetCombimedCdrFieldVal(t *testing.T) { func TestGetDateTimeFieldVal(t *testing.T) { cdreTst := new(CdrExporter) - cdrTst := &engine.StoredCdr{CgrId: utils.Sha1("dsafdsaf", time.Unix(1383813745, 0).UTC().String()), TOR: utils.VOICE, AccId: "dsafdsaf", CdrHost: "192.168.1.1", + cdrTst := &engine.CDR{CGRID: utils.Sha1("dsafdsaf", time.Unix(1383813745, 0).UTC().String()), TOR: utils.VOICE, OriginID: "dsafdsaf", OriginHost: "192.168.1.1", ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002", SetupTime: time.Unix(1383813745, 0).UTC(), AnswerTime: time.Unix(1383813746, 0).UTC(), - Usage: time.Duration(10) * time.Second, MediationRunId: utils.DEFAULT_RUNID, Cost: 1.01, + Usage: time.Duration(10) * time.Second, RunID: utils.DEFAULT_RUNID, Cost: 1.01, ExtraFields: map[string]string{"stop_time": "2014-06-11 19:19:00 +0000 UTC", "fieldextr2": "valextr2"}} val, _ := utils.ParseRSRFields("stop_time", utils.INFIELD_SEP) layout := "2006-01-02 15:04:05" @@ -105,10 +105,10 @@ func TestGetDateTimeFieldVal(t *testing.T) { func TestCdreCdrFieldValue(t *testing.T) { cdre := new(CdrExporter) - cdr := &engine.StoredCdr{CgrId: utils.Sha1("dsafdsaf", time.Unix(1383813745, 0).UTC().String()), TOR: utils.VOICE, AccId: "dsafdsaf", CdrHost: "192.168.1.1", + cdr := &engine.CDR{CGRID: utils.Sha1("dsafdsaf", time.Unix(1383813745, 0).UTC().String()), TOR: utils.VOICE, OriginID: "dsafdsaf", OriginHost: "192.168.1.1", ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002", SetupTime: time.Unix(1383813745, 0).UTC(), AnswerTime: time.Unix(1383813746, 0).UTC(), - Usage: time.Duration(10) * time.Second, MediationRunId: utils.DEFAULT_RUNID, Cost: 1.01} + Usage: time.Duration(10) * time.Second, RunID: utils.DEFAULT_RUNID, Cost: 1.01} val, _ := utils.ParseRSRFields(utils.DESTINATION, utils.INFIELD_SEP) cfgCdrFld := &config.CfgCdrField{Tag: "destination", Type: "cdrfield", FieldId: utils.DESTINATION, Value: val} if val, err := cdre.cdrFieldValue(cdr, cfgCdrFld); err != nil { diff --git a/cdre/csv_test.go b/cdre/csv_test.go index 647f8379a..e51483e0e 100644 --- a/cdre/csv_test.go +++ b/cdre/csv_test.go @@ -33,13 +33,14 @@ import ( func TestCsvCdrWriter(t *testing.T) { writer := &bytes.Buffer{} cfg, _ := config.NewDefaultCGRConfig() - storedCdr1 := &engine.StoredCdr{CgrId: utils.Sha1("dsafdsaf", time.Unix(1383813745, 0).UTC().String()), TOR: utils.VOICE, AccId: "dsafdsaf", CdrHost: "192.168.1.1", + storedCdr1 := &engine.CDR{ + CGRID: utils.Sha1("dsafdsaf", time.Unix(1383813745, 0).UTC().String()), TOR: utils.VOICE, OriginID: "dsafdsaf", OriginHost: "192.168.1.1", ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002", SetupTime: time.Unix(1383813745, 0).UTC(), AnswerTime: time.Unix(1383813746, 0).UTC(), - Usage: time.Duration(10) * time.Second, MediationRunId: utils.DEFAULT_RUNID, + Usage: time.Duration(10) * time.Second, RunID: utils.DEFAULT_RUNID, ExtraFields: map[string]string{"extra1": "val_extra1", "extra2": "val_extra2", "extra3": "val_extra3"}, Cost: 1.01, } - cdre, err := NewCdrExporter([]*engine.StoredCdr{storedCdr1}, nil, cfg.CdreProfiles["*default"], utils.CSV, ',', "firstexport", 0.0, 0.0, 0.0, 0.0, 0, 4, + cdre, err := NewCdrExporter([]*engine.CDR{storedCdr1}, nil, cfg.CdreProfiles["*default"], utils.CSV, ',', "firstexport", 0.0, 0.0, 0.0, 0.0, 0, 4, cfg.RoundingDecimals, "", 0, cfg.HttpSkipTlsVerify, "") if err != nil { t.Error("Unexpected error received: ", err) @@ -61,13 +62,13 @@ func TestCsvCdrWriter(t *testing.T) { func TestAlternativeFieldSeparator(t *testing.T) { writer := &bytes.Buffer{} cfg, _ := config.NewDefaultCGRConfig() - storedCdr1 := &engine.StoredCdr{CgrId: utils.Sha1("dsafdsaf", time.Unix(1383813745, 0).UTC().String()), TOR: utils.VOICE, AccId: "dsafdsaf", CdrHost: "192.168.1.1", + storedCdr1 := &engine.CDR{CGRID: utils.Sha1("dsafdsaf", time.Unix(1383813745, 0).UTC().String()), TOR: utils.VOICE, OriginID: "dsafdsaf", OriginHost: "192.168.1.1", ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002", SetupTime: time.Unix(1383813745, 0).UTC(), AnswerTime: time.Unix(1383813746, 0).UTC(), - Usage: time.Duration(10) * time.Second, MediationRunId: utils.DEFAULT_RUNID, + Usage: time.Duration(10) * time.Second, RunID: utils.DEFAULT_RUNID, ExtraFields: map[string]string{"extra1": "val_extra1", "extra2": "val_extra2", "extra3": "val_extra3"}, Cost: 1.01, } - cdre, err := NewCdrExporter([]*engine.StoredCdr{storedCdr1}, nil, cfg.CdreProfiles["*default"], utils.CSV, '|', + cdre, err := NewCdrExporter([]*engine.CDR{storedCdr1}, nil, cfg.CdreProfiles["*default"], utils.CSV, '|', "firstexport", 0.0, 0.0, 0.0, 0.0, 0, 4, cfg.RoundingDecimals, "", 0, cfg.HttpSkipTlsVerify, "") if err != nil { t.Error("Unexpected error received: ", err) diff --git a/cdre/fixedwidth_test.go b/cdre/fixedwidth_test.go index f0e15a71f..0b5928f86 100644 --- a/cdre/fixedwidth_test.go +++ b/cdre/fixedwidth_test.go @@ -118,16 +118,16 @@ func TestWriteCdr(t *testing.T) { ContentFields: contentCfgFlds, TrailerFields: trailerCfgFlds, } - cdr := &engine.StoredCdr{CgrId: utils.Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 20, 0, time.UTC).String()), - TOR: utils.VOICE, OrderId: 1, AccId: "dsafdsaf", CdrHost: "192.168.1.1", + cdr := &engine.CDR{CGRID: utils.Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 20, 0, time.UTC).String()), + TOR: utils.VOICE, OrderID: 1, OriginID: "dsafdsaf", OriginHost: "192.168.1.1", ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002", SetupTime: time.Date(2013, 11, 7, 8, 42, 20, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), - Usage: time.Duration(10) * time.Second, MediationRunId: utils.DEFAULT_RUNID, Cost: 2.34567, + Usage: time.Duration(10) * time.Second, RunID: utils.DEFAULT_RUNID, Cost: 2.34567, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, } - cdre, err := NewCdrExporter([]*engine.StoredCdr{cdr}, nil, cdreCfg, utils.CDRE_FIXED_WIDTH, ',', "fwv_1", 0.0, 0.0, 0.0, 0.0, 0, 4, + cdre, err := NewCdrExporter([]*engine.CDR{cdr}, nil, cdreCfg, utils.CDRE_FIXED_WIDTH, ',', "fwv_1", 0.0, 0.0, 0.0, 0.0, 0, 4, cfg.RoundingDecimals, "", -1, cfg.HttpSkipTlsVerify, "") if err != nil { t.Error(err) @@ -176,33 +176,33 @@ func TestWriteCdrs(t *testing.T) { ContentFields: contentCfgFlds, TrailerFields: trailerCfgFlds, } - cdr1 := &engine.StoredCdr{CgrId: utils.Sha1("aaa1", time.Date(2013, 11, 7, 8, 42, 20, 0, time.UTC).String()), - TOR: utils.VOICE, OrderId: 2, AccId: "aaa1", CdrHost: "192.168.1.1", ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", + cdr1 := &engine.CDR{CGRID: utils.Sha1("aaa1", time.Date(2013, 11, 7, 8, 42, 20, 0, time.UTC).String()), + TOR: utils.VOICE, OrderID: 2, OriginID: "aaa1", OriginHost: "192.168.1.1", ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1010", SetupTime: time.Date(2013, 11, 7, 8, 42, 20, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), - Usage: time.Duration(10) * time.Second, MediationRunId: utils.DEFAULT_RUNID, Cost: 2.25, + Usage: time.Duration(10) * time.Second, RunID: utils.DEFAULT_RUNID, Cost: 2.25, ExtraFields: map[string]string{"productnumber": "12341", "fieldextr2": "valextr2"}, } - cdr2 := &engine.StoredCdr{CgrId: utils.Sha1("aaa2", time.Date(2013, 11, 7, 7, 42, 20, 0, time.UTC).String()), - TOR: utils.VOICE, OrderId: 4, AccId: "aaa2", CdrHost: "192.168.1.2", ReqType: utils.META_PREPAID, Direction: "*out", Tenant: "cgrates.org", + cdr2 := &engine.CDR{CGRID: utils.Sha1("aaa2", time.Date(2013, 11, 7, 7, 42, 20, 0, time.UTC).String()), + TOR: utils.VOICE, OrderID: 4, OriginID: "aaa2", OriginHost: "192.168.1.2", ReqType: utils.META_PREPAID, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1002", Subject: "1002", Destination: "1011", SetupTime: time.Date(2013, 11, 7, 7, 42, 20, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 7, 42, 26, 0, time.UTC), - Usage: time.Duration(5) * time.Minute, MediationRunId: utils.DEFAULT_RUNID, Cost: 1.40001, + Usage: time.Duration(5) * time.Minute, RunID: utils.DEFAULT_RUNID, Cost: 1.40001, ExtraFields: map[string]string{"productnumber": "12342", "fieldextr2": "valextr2"}, } - cdr3 := &engine.StoredCdr{} - cdr4 := &engine.StoredCdr{CgrId: utils.Sha1("aaa3", time.Date(2013, 11, 7, 9, 42, 18, 0, time.UTC).String()), - TOR: utils.VOICE, OrderId: 3, AccId: "aaa4", CdrHost: "192.168.1.4", ReqType: utils.META_POSTPAID, Direction: "*out", Tenant: "cgrates.org", + cdr3 := &engine.CDR{} + cdr4 := &engine.CDR{CGRID: utils.Sha1("aaa3", time.Date(2013, 11, 7, 9, 42, 18, 0, time.UTC).String()), + TOR: utils.VOICE, OrderID: 3, OriginID: "aaa4", OriginHost: "192.168.1.4", ReqType: utils.META_POSTPAID, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1004", Subject: "1004", Destination: "1013", SetupTime: time.Date(2013, 11, 7, 9, 42, 18, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 9, 42, 26, 0, time.UTC), - Usage: time.Duration(20) * time.Second, MediationRunId: utils.DEFAULT_RUNID, Cost: 2.34567, + Usage: time.Duration(20) * time.Second, RunID: utils.DEFAULT_RUNID, Cost: 2.34567, ExtraFields: map[string]string{"productnumber": "12344", "fieldextr2": "valextr2"}, } cfg, _ := config.NewDefaultCGRConfig() - cdre, err := NewCdrExporter([]*engine.StoredCdr{cdr1, cdr2, cdr3, cdr4}, nil, cdreCfg, utils.CDRE_FIXED_WIDTH, ',', + cdre, err := NewCdrExporter([]*engine.CDR{cdr1, cdr2, cdr3, cdr4}, nil, cdreCfg, utils.CDRE_FIXED_WIDTH, ',', "fwv_1", 0.0, 0.0, 0.0, 0.0, 0, 4, cfg.RoundingDecimals, "", -1, cfg.HttpSkipTlsVerify, "") if err != nil { t.Error(err) diff --git a/cmd/cgr-loader/migrator_rc8.go b/cmd/cgr-loader/migrator_rc8.go index a1f11378b..0165ca573 100644 --- a/cmd/cgr-loader/migrator_rc8.go +++ b/cmd/cgr-loader/migrator_rc8.go @@ -408,7 +408,7 @@ func (mig MigratorRC8) migrateDerivedChargers() error { } } newDcs := &utils.DerivedChargers{ - DestinationIds: make(utils.StringMap), + DestinationIDs: make(utils.StringMap), Chargers: oldDcs, } newDcsMap[key] = newDcs diff --git a/config/cdreconfig.go b/config/cdreconfig.go index fd1e78ee2..55a98c3b5 100644 --- a/config/cdreconfig.go +++ b/config/cdreconfig.go @@ -23,14 +23,14 @@ type CdreConfig struct { CdrFormat string FieldSeparator rune DataUsageMultiplyFactor float64 - SmsUsageMultiplyFactor float64 + SMSUsageMultiplyFactor float64 GenericUsageMultiplyFactor float64 CostMultiplyFactor float64 CostRoundingDecimals int CostShiftDigits int - MaskDestId string + MaskDestinationID string MaskLength int - ExportDir string + ExportFolder string HeaderFields []*CfgCdrField ContentFields []*CfgCdrField TrailerFields []*CfgCdrField @@ -52,7 +52,7 @@ func (self *CdreConfig) loadFromJsonCfg(jsnCfg *CdreJsonCfg) error { self.DataUsageMultiplyFactor = *jsnCfg.Data_usage_multiply_factor } if jsnCfg.Sms_usage_multiply_factor != nil { - self.SmsUsageMultiplyFactor = *jsnCfg.Sms_usage_multiply_factor + self.SMSUsageMultiplyFactor = *jsnCfg.Sms_usage_multiply_factor } if jsnCfg.Generic_usage_multiply_factor != nil { self.GenericUsageMultiplyFactor = *jsnCfg.Generic_usage_multiply_factor @@ -67,13 +67,13 @@ func (self *CdreConfig) loadFromJsonCfg(jsnCfg *CdreJsonCfg) error { self.CostShiftDigits = *jsnCfg.Cost_shift_digits } if jsnCfg.Mask_destination_id != nil { - self.MaskDestId = *jsnCfg.Mask_destination_id + self.MaskDestinationID = *jsnCfg.Mask_destination_id } if jsnCfg.Mask_length != nil { self.MaskLength = *jsnCfg.Mask_length } - if jsnCfg.Export_dir != nil { - self.ExportDir = *jsnCfg.Export_dir + if jsnCfg.Export_folder != nil { + self.ExportFolder = *jsnCfg.Export_folder } if jsnCfg.Header_fields != nil { if self.HeaderFields, err = CfgCdrFieldsFromCdrFieldsJsonCfg(*jsnCfg.Header_fields); err != nil { @@ -99,14 +99,14 @@ func (self *CdreConfig) Clone() *CdreConfig { clnCdre.CdrFormat = self.CdrFormat clnCdre.FieldSeparator = self.FieldSeparator clnCdre.DataUsageMultiplyFactor = self.DataUsageMultiplyFactor - clnCdre.SmsUsageMultiplyFactor = self.SmsUsageMultiplyFactor + clnCdre.SMSUsageMultiplyFactor = self.SMSUsageMultiplyFactor clnCdre.GenericUsageMultiplyFactor = self.GenericUsageMultiplyFactor clnCdre.CostMultiplyFactor = self.CostMultiplyFactor clnCdre.CostRoundingDecimals = self.CostRoundingDecimals clnCdre.CostShiftDigits = self.CostShiftDigits - clnCdre.MaskDestId = self.MaskDestId + clnCdre.MaskDestinationID = self.MaskDestinationID clnCdre.MaskLength = self.MaskLength - clnCdre.ExportDir = self.ExportDir + clnCdre.ExportFolder = self.ExportFolder clnCdre.HeaderFields = make([]*CfgCdrField, len(self.HeaderFields)) for idx, fld := range self.HeaderFields { clonedVal := *fld diff --git a/config/cdreconfig_test.go b/config/cdreconfig_test.go index 84a95d8f4..66e054d34 100644 --- a/config/cdreconfig_test.go +++ b/config/cdreconfig_test.go @@ -44,9 +44,9 @@ func TestCdreCfgClone(t *testing.T) { CostMultiplyFactor: 1.0, CostRoundingDecimals: -1, CostShiftDigits: 0, - MaskDestId: "MASKED_DESTINATIONS", + MaskDestinationID: "MASKED_DESTINATIONS", MaskLength: 0, - ExportDir: "/var/log/cgrates/cdre", + ExportFolder: "/var/log/cgrates/cdre", ContentFields: initContentFlds, } eClnContentFlds := []*CfgCdrField{ @@ -66,9 +66,9 @@ func TestCdreCfgClone(t *testing.T) { CostMultiplyFactor: 1.0, CostRoundingDecimals: -1, CostShiftDigits: 0, - MaskDestId: "MASKED_DESTINATIONS", + MaskDestinationID: "MASKED_DESTINATIONS", MaskLength: 0, - ExportDir: "/var/log/cgrates/cdre", + ExportFolder: "/var/log/cgrates/cdre", HeaderFields: emptyFields, ContentFields: eClnContentFlds, TrailerFields: emptyFields, diff --git a/config/config_defaults.go b/config/config_defaults.go index 0ffd77b09..b90c6f4b9 100644 --- a/config/config_defaults.go +++ b/config/config_defaults.go @@ -131,19 +131,19 @@ const CGRATES_CFG_JSON = ` "field_separator": ",", "data_usage_multiply_factor": 1, // multiply data usage before export (eg: convert from KBytes to Bytes) "sms_usage_multiply_factor": 1, // multiply data usage before export (eg: convert from SMS unit to call duration in some billing systems) - "generic_usage_multiply_factor": 1, // multiply data usage before export (eg: convert from GENERIC unit to call duration in some billing systems) + "generic_usage_multiply_factor": 1, // multiply data usage before export (eg: convert from GENERIC unit to call duration in some billing systems) "cost_multiply_factor": 1, // multiply cost before export, eg: add VAT "cost_rounding_decimals": -1, // rounding decimals for Cost values. -1 to disable rounding "cost_shift_digits": 0, // shift digits in the cost on export (eg: convert from EUR to cents) "mask_destination_id": "MASKED_DESTINATIONS", // destination id containing called addresses to be masked on export "mask_length": 0, // length of the destination suffix to be masked - "export_dir": "/var/log/cgrates/cdre", // path where the exported CDRs will be placed + "export_folder": "/var/log/cgrates/cdre", // path where the exported CDRs will be placed "header_fields": [], // template of the exported header fields "content_fields": [ // template of the exported content fields - {"tag": "CgrId", "field_id": "CgrId", "type": "*composed", "value": "CgrId"}, - {"tag":"RunId", "field_id": "MediationRunId", "type": "*composed", "value": "MediationRunId"}, - {"tag":"Tor", "field_id": "TOR", "type": "*composed", "value": "TOR"}, - {"tag":"AccId", "field_id": "AccId", "type": "*composed", "value": "AccId"}, + {"tag": "CGRID", "field_id": "CGRID", "type": "*composed", "value": "CGRID"}, + {"tag":"RunID", "field_id": "RunID", "type": "*composed", "value": "RunID"}, + {"tag":"TOR", "field_id": "TOR", "type": "*composed", "value": "TOR"}, + {"tag":"OriginID", "field_id": "OriginID", "type": "*composed", "value": "OriginID"}, {"tag":"ReqType", "field_id": "ReqType", "type": "*composed", "value": "ReqType"}, {"tag":"Direction", "field_id": "Direction", "type": "*composed", "value": "Direction"}, {"tag":"Tenant", "field_id": "Tenant", "type": "*composed", "value": "Tenant"}, @@ -181,18 +181,18 @@ const CGRATES_CFG_JSON = ` "partial_record_cache": "10s", // duration to cache partial records when not pairing "header_fields": [], // template of the import header fields "content_fields":[ // import content_fields template, tag will match internally CDR field, in case of .csv value will be represented by index of the field value - {"tag": "tor", "field_id": "TOR", "type": "*composed", "value": "2", "mandatory": true}, - {"tag": "accid", "field_id": "AccId", "type": "*composed", "value": "3", "mandatory": true}, - {"tag": "reqtype", "field_id": "ReqType", "type": "*composed", "value": "4", "mandatory": true}, - {"tag": "direction", "field_id": "Direction", "type": "*composed", "value": "5", "mandatory": true}, - {"tag": "tenant", "field_id": "Tenant", "type": "*composed", "value": "6", "mandatory": true}, - {"tag": "category", "field_id": "Category", "type": "*composed", "value": "7", "mandatory": true}, - {"tag": "account", "field_id": "Account", "type": "*composed", "value": "8", "mandatory": true}, - {"tag": "subject", "field_id": "Subject", "type": "*composed", "value": "9", "mandatory": true}, - {"tag": "destination", "field_id": "Destination", "type": "*composed", "value": "10", "mandatory": true}, - {"tag": "setup_time", "field_id": "SetupTime", "type": "*composed", "value": "11", "mandatory": true}, - {"tag": "answer_time", "field_id": "AnswerTime", "type": "*composed", "value": "12", "mandatory": true}, - {"tag": "usage", "field_id": "Usage", "type": "*composed", "value": "13", "mandatory": true}, + {"tag": "TOR", "field_id": "TOR", "type": "*composed", "value": "2", "mandatory": true}, + {"tag": "OriginID", "field_id": "OriginID", "type": "*composed", "value": "3", "mandatory": true}, + {"tag": "ReqType", "field_id": "ReqType", "type": "*composed", "value": "4", "mandatory": true}, + {"tag": "Direction", "field_id": "Direction", "type": "*composed", "value": "5", "mandatory": true}, + {"tag": "Tenant", "field_id": "Tenant", "type": "*composed", "value": "6", "mandatory": true}, + {"tag": "Category", "field_id": "Category", "type": "*composed", "value": "7", "mandatory": true}, + {"tag": "Account", "field_id": "Account", "type": "*composed", "value": "8", "mandatory": true}, + {"tag": "Subject", "field_id": "Subject", "type": "*composed", "value": "9", "mandatory": true}, + {"tag": "Destination", "field_id": "Destination", "type": "*composed", "value": "10", "mandatory": true}, + {"tag": "SetupTime", "field_id": "SetupTime", "type": "*composed", "value": "11", "mandatory": true}, + {"tag": "AnswerTime", "field_id": "AnswerTime", "type": "*composed", "value": "12", "mandatory": true}, + {"tag": "Usage", "field_id": "Usage", "type": "*composed", "value": "13", "mandatory": true}, ], "trailer_fields": [], // template of the import trailer fields } @@ -278,18 +278,18 @@ const CGRATES_CFG_JSON = ` "request_filter": "Subscription-Id>Subscription-Id-Type(0)", // filter requests processed by this processor "continue_on_success": false, // continue to the next template if executed "content_fields":[ // import content_fields template, tag will match internally CDR field, in case of .csv value will be represented by index of the field value - {"tag": "tor", "field_id": "TOR", "type": "*composed", "value": "^*voice", "mandatory": true}, - {"tag": "accid", "field_id": "AccId", "type": "*composed", "value": "Session-Id", "mandatory": true}, - {"tag": "reqtype", "field_id": "ReqType", "type": "*composed", "value": "^*users", "mandatory": true}, - {"tag": "direction", "field_id": "Direction", "type": "*composed", "value": "^*out", "mandatory": true}, - {"tag": "tenant", "field_id": "Tenant", "type": "*composed", "value": "^*users", "mandatory": true}, - {"tag": "category", "field_id": "Category", "type": "*composed", "value": "^call", "mandatory": true}, - {"tag": "account", "field_id": "Account", "type": "*composed", "value": "^*users", "mandatory": true}, - {"tag": "subject", "field_id": "Subject", "type": "*composed", "value": "^*users", "mandatory": true}, - {"tag": "destination", "field_id": "Destination", "type": "*composed", "value": "Service-Information>IN-Information>Real-Called-Number", "mandatory": true}, - {"tag": "setup_time", "field_id": "SetupTime", "type": "*composed", "value": "Event-Timestamp", "mandatory": true}, - {"tag": "answer_time", "field_id": "AnswerTime", "type": "*composed", "value": "Event-Timestamp", "mandatory": true}, - {"tag": "usage", "field_id": "Usage", "type": "*handler", "handler_id": "*ccr_usage", "mandatory": true}, + {"tag": "TOR", "field_id": "TOR", "type": "*composed", "value": "^*voice", "mandatory": true}, + {"tag": "OriginID", "field_id": "OriginID", "type": "*composed", "value": "Session-Id", "mandatory": true}, + {"tag": "ReqType", "field_id": "ReqType", "type": "*composed", "value": "^*users", "mandatory": true}, + {"tag": "Direction", "field_id": "Direction", "type": "*composed", "value": "^*out", "mandatory": true}, + {"tag": "Tenant", "field_id": "Tenant", "type": "*composed", "value": "^*users", "mandatory": true}, + {"tag": "Category", "field_id": "Category", "type": "*composed", "value": "^call", "mandatory": true}, + {"tag": "Account", "field_id": "Account", "type": "*composed", "value": "^*users", "mandatory": true}, + {"tag": "Subject", "field_id": "Subject", "type": "*composed", "value": "^*users", "mandatory": true}, + {"tag": "Destination", "field_id": "Destination", "type": "*composed", "value": "Service-Information>IN-Information>Real-Called-Number", "mandatory": true}, + {"tag": "SetupTime", "field_id": "SetupTime", "type": "*composed", "value": "Event-Timestamp", "mandatory": true}, + {"tag": "AnswerTime", "field_id": "AnswerTime", "type": "*composed", "value": "Event-Timestamp", "mandatory": true}, + {"tag": "Usage", "field_id": "Usage", "type": "*handler", "handler_id": "*ccr_usage", "mandatory": true}, {"tag": "subscriber_id", "field_id": "SubscriberId", "type": "*composed", "value": "Subscription-Id>Subscription-Id-Data", "mandatory": true}, ], }, @@ -339,7 +339,7 @@ const CGRATES_CFG_JSON = ` "response_group": "03", // determines how taxes are grouped for the response <03|13> "response_type": "D4", // determines the granularity of taxes and (optionally) the decimal precision for the tax calculations and amounts in the response "regulatory_code": "03", // provider type - "client_tracking": "CgrId", // template extracting client information out of StoredCdr; <$RSRFields> + "client_tracking": "CGRID", // template extracting client information out of StoredCdr; <$RSRFields> "customer_number": "Subject", // template extracting customer number out of StoredCdr; <$RSRFields> "orig_number": "Subject", // template extracting origination number out of StoredCdr; <$RSRFields> "term_number": "Destination", // template extracting termination number out of StoredCdr; <$RSRFields> diff --git a/config/config_json_test.go b/config/config_json_test.go index b618bb1c8..443c97b76 100644 --- a/config/config_json_test.go +++ b/config/config_json_test.go @@ -178,67 +178,67 @@ func TestDfCdrStatsJsonCfg(t *testing.T) { func TestDfCdreJsonCfgs(t *testing.T) { eFields := []*CdrFieldJsonCfg{} eContentFlds := []*CdrFieldJsonCfg{ - &CdrFieldJsonCfg{Tag: utils.StringPointer("CgrId"), + &CdrFieldJsonCfg{Tag: utils.StringPointer("CGRID"), Field_id: utils.StringPointer(utils.CGRID), - Type: utils.StringPointer("*composed"), + Type: utils.StringPointer(utils.META_COMPOSED), Value: utils.StringPointer(utils.CGRID)}, - &CdrFieldJsonCfg{Tag: utils.StringPointer("RunId"), + &CdrFieldJsonCfg{Tag: utils.StringPointer("RunID"), Field_id: utils.StringPointer(utils.MEDI_RUNID), - Type: utils.StringPointer("*composed"), + Type: utils.StringPointer(utils.META_COMPOSED), Value: utils.StringPointer(utils.MEDI_RUNID)}, - &CdrFieldJsonCfg{Tag: utils.StringPointer("Tor"), + &CdrFieldJsonCfg{Tag: utils.StringPointer("TOR"), Field_id: utils.StringPointer(utils.TOR), - Type: utils.StringPointer("*composed"), + Type: utils.StringPointer(utils.META_COMPOSED), Value: utils.StringPointer(utils.TOR)}, - &CdrFieldJsonCfg{Tag: utils.StringPointer("AccId"), + &CdrFieldJsonCfg{Tag: utils.StringPointer("OriginID"), Field_id: utils.StringPointer(utils.ACCID), - Type: utils.StringPointer("*composed"), + Type: utils.StringPointer(utils.META_COMPOSED), Value: utils.StringPointer(utils.ACCID)}, &CdrFieldJsonCfg{Tag: utils.StringPointer("ReqType"), Field_id: utils.StringPointer(utils.REQTYPE), - Type: utils.StringPointer("*composed"), + Type: utils.StringPointer(utils.META_COMPOSED), Value: utils.StringPointer(utils.REQTYPE)}, &CdrFieldJsonCfg{Tag: utils.StringPointer("Direction"), Field_id: utils.StringPointer(utils.DIRECTION), - Type: utils.StringPointer("*composed"), + Type: utils.StringPointer(utils.META_COMPOSED), Value: utils.StringPointer(utils.DIRECTION)}, &CdrFieldJsonCfg{Tag: utils.StringPointer("Tenant"), Field_id: utils.StringPointer(utils.TENANT), - Type: utils.StringPointer("*composed"), + Type: utils.StringPointer(utils.META_COMPOSED), Value: utils.StringPointer(utils.TENANT)}, &CdrFieldJsonCfg{Tag: utils.StringPointer("Category"), Field_id: utils.StringPointer(utils.CATEGORY), - Type: utils.StringPointer("*composed"), + Type: utils.StringPointer(utils.META_COMPOSED), Value: utils.StringPointer(utils.CATEGORY)}, &CdrFieldJsonCfg{Tag: utils.StringPointer("Account"), Field_id: utils.StringPointer(utils.ACCOUNT), - Type: utils.StringPointer("*composed"), + Type: utils.StringPointer(utils.META_COMPOSED), Value: utils.StringPointer(utils.ACCOUNT)}, &CdrFieldJsonCfg{Tag: utils.StringPointer("Subject"), Field_id: utils.StringPointer(utils.SUBJECT), - Type: utils.StringPointer("*composed"), + Type: utils.StringPointer(utils.META_COMPOSED), Value: utils.StringPointer(utils.SUBJECT)}, &CdrFieldJsonCfg{Tag: utils.StringPointer("Destination"), Field_id: utils.StringPointer(utils.DESTINATION), - Type: utils.StringPointer("*composed"), + Type: utils.StringPointer(utils.META_COMPOSED), Value: utils.StringPointer(utils.DESTINATION)}, &CdrFieldJsonCfg{Tag: utils.StringPointer("SetupTime"), Field_id: utils.StringPointer(utils.SETUP_TIME), - Type: utils.StringPointer("*composed"), + Type: utils.StringPointer(utils.META_COMPOSED), Value: utils.StringPointer(utils.SETUP_TIME), Layout: utils.StringPointer("2006-01-02T15:04:05Z07:00")}, &CdrFieldJsonCfg{Tag: utils.StringPointer("AnswerTime"), Field_id: utils.StringPointer(utils.ANSWER_TIME), - Type: utils.StringPointer("*composed"), + Type: utils.StringPointer(utils.META_COMPOSED), Value: utils.StringPointer(utils.ANSWER_TIME), Layout: utils.StringPointer("2006-01-02T15:04:05Z07:00")}, &CdrFieldJsonCfg{Tag: utils.StringPointer("Usage"), Field_id: utils.StringPointer(utils.USAGE), - Type: utils.StringPointer("*composed"), + Type: utils.StringPointer(utils.META_COMPOSED), Value: utils.StringPointer(utils.USAGE)}, &CdrFieldJsonCfg{Tag: utils.StringPointer("Cost"), Field_id: utils.StringPointer(utils.COST), - Type: utils.StringPointer("*composed"), + Type: utils.StringPointer(utils.META_COMPOSED), Value: utils.StringPointer(utils.COST)}, } eCfg := map[string]*CdreJsonCfg{ @@ -253,7 +253,7 @@ func TestDfCdreJsonCfgs(t *testing.T) { Cost_shift_digits: utils.IntPointer(0), Mask_destination_id: utils.StringPointer("MASKED_DESTINATIONS"), Mask_length: utils.IntPointer(0), - Export_dir: utils.StringPointer("/var/log/cgrates/cdre"), + Export_folder: utils.StringPointer("/var/log/cgrates/cdre"), Header_fields: &eFields, Content_fields: &eContentFlds, Trailer_fields: &eFields, @@ -269,29 +269,29 @@ func TestDfCdreJsonCfgs(t *testing.T) { func TestDfCdrcJsonCfg(t *testing.T) { eFields := []*CdrFieldJsonCfg{} cdrFields := []*CdrFieldJsonCfg{ - &CdrFieldJsonCfg{Tag: utils.StringPointer("tor"), Field_id: utils.StringPointer(utils.TOR), Type: utils.StringPointer(utils.META_COMPOSED), + &CdrFieldJsonCfg{Tag: utils.StringPointer("TOR"), Field_id: utils.StringPointer(utils.TOR), Type: utils.StringPointer(utils.META_COMPOSED), Value: utils.StringPointer("2"), Mandatory: utils.BoolPointer(true)}, - &CdrFieldJsonCfg{Tag: utils.StringPointer("accid"), Field_id: utils.StringPointer(utils.ACCID), Type: utils.StringPointer(utils.META_COMPOSED), + &CdrFieldJsonCfg{Tag: utils.StringPointer("OriginID"), Field_id: utils.StringPointer(utils.ACCID), Type: utils.StringPointer(utils.META_COMPOSED), Value: utils.StringPointer("3"), Mandatory: utils.BoolPointer(true)}, - &CdrFieldJsonCfg{Tag: utils.StringPointer("reqtype"), Field_id: utils.StringPointer(utils.REQTYPE), Type: utils.StringPointer(utils.META_COMPOSED), + &CdrFieldJsonCfg{Tag: utils.StringPointer("ReqType"), Field_id: utils.StringPointer(utils.REQTYPE), Type: utils.StringPointer(utils.META_COMPOSED), Value: utils.StringPointer("4"), Mandatory: utils.BoolPointer(true)}, - &CdrFieldJsonCfg{Tag: utils.StringPointer("direction"), Field_id: utils.StringPointer(utils.DIRECTION), Type: utils.StringPointer(utils.META_COMPOSED), + &CdrFieldJsonCfg{Tag: utils.StringPointer("Direction"), Field_id: utils.StringPointer(utils.DIRECTION), Type: utils.StringPointer(utils.META_COMPOSED), Value: utils.StringPointer("5"), Mandatory: utils.BoolPointer(true)}, - &CdrFieldJsonCfg{Tag: utils.StringPointer("tenant"), Field_id: utils.StringPointer(utils.TENANT), Type: utils.StringPointer(utils.META_COMPOSED), + &CdrFieldJsonCfg{Tag: utils.StringPointer("Tenant"), Field_id: utils.StringPointer(utils.TENANT), Type: utils.StringPointer(utils.META_COMPOSED), Value: utils.StringPointer("6"), Mandatory: utils.BoolPointer(true)}, - &CdrFieldJsonCfg{Tag: utils.StringPointer("category"), Field_id: utils.StringPointer(utils.CATEGORY), Type: utils.StringPointer(utils.META_COMPOSED), + &CdrFieldJsonCfg{Tag: utils.StringPointer("Category"), Field_id: utils.StringPointer(utils.CATEGORY), Type: utils.StringPointer(utils.META_COMPOSED), Value: utils.StringPointer("7"), Mandatory: utils.BoolPointer(true)}, - &CdrFieldJsonCfg{Tag: utils.StringPointer("account"), Field_id: utils.StringPointer(utils.ACCOUNT), Type: utils.StringPointer(utils.META_COMPOSED), + &CdrFieldJsonCfg{Tag: utils.StringPointer("Account"), Field_id: utils.StringPointer(utils.ACCOUNT), Type: utils.StringPointer(utils.META_COMPOSED), Value: utils.StringPointer("8"), Mandatory: utils.BoolPointer(true)}, - &CdrFieldJsonCfg{Tag: utils.StringPointer("subject"), Field_id: utils.StringPointer(utils.SUBJECT), Type: utils.StringPointer(utils.META_COMPOSED), + &CdrFieldJsonCfg{Tag: utils.StringPointer("Subject"), Field_id: utils.StringPointer(utils.SUBJECT), Type: utils.StringPointer(utils.META_COMPOSED), Value: utils.StringPointer("9"), Mandatory: utils.BoolPointer(true)}, - &CdrFieldJsonCfg{Tag: utils.StringPointer("destination"), Field_id: utils.StringPointer(utils.DESTINATION), Type: utils.StringPointer(utils.META_COMPOSED), + &CdrFieldJsonCfg{Tag: utils.StringPointer("Destination"), Field_id: utils.StringPointer(utils.DESTINATION), Type: utils.StringPointer(utils.META_COMPOSED), Value: utils.StringPointer("10"), Mandatory: utils.BoolPointer(true)}, - &CdrFieldJsonCfg{Tag: utils.StringPointer("setup_time"), Field_id: utils.StringPointer(utils.SETUP_TIME), Type: utils.StringPointer(utils.META_COMPOSED), + &CdrFieldJsonCfg{Tag: utils.StringPointer("SetupTime"), Field_id: utils.StringPointer(utils.SETUP_TIME), Type: utils.StringPointer(utils.META_COMPOSED), Value: utils.StringPointer("11"), Mandatory: utils.BoolPointer(true)}, - &CdrFieldJsonCfg{Tag: utils.StringPointer("answer_time"), Field_id: utils.StringPointer(utils.ANSWER_TIME), Type: utils.StringPointer(utils.META_COMPOSED), + &CdrFieldJsonCfg{Tag: utils.StringPointer("AnswerTime"), Field_id: utils.StringPointer(utils.ANSWER_TIME), Type: utils.StringPointer(utils.META_COMPOSED), Value: utils.StringPointer("12"), Mandatory: utils.BoolPointer(true)}, - &CdrFieldJsonCfg{Tag: utils.StringPointer("usage"), Field_id: utils.StringPointer(utils.USAGE), Type: utils.StringPointer(utils.META_COMPOSED), + &CdrFieldJsonCfg{Tag: utils.StringPointer("Usage"), Field_id: utils.StringPointer(utils.USAGE), Type: utils.StringPointer(utils.META_COMPOSED), Value: utils.StringPointer("13"), Mandatory: utils.BoolPointer(true)}, } eCfg := map[string]*CdrcJsonCfg{ @@ -434,29 +434,29 @@ func TestDiameterAgentJsonCfg(t *testing.T) { Request_filter: utils.StringPointer("Subscription-Id>Subscription-Id-Type(0)"), Continue_on_success: utils.BoolPointer(false), Content_fields: &[]*CdrFieldJsonCfg{ - &CdrFieldJsonCfg{Tag: utils.StringPointer("tor"), Field_id: utils.StringPointer(utils.TOR), Type: utils.StringPointer(utils.META_COMPOSED), + &CdrFieldJsonCfg{Tag: utils.StringPointer("TOR"), Field_id: utils.StringPointer(utils.TOR), Type: utils.StringPointer(utils.META_COMPOSED), Value: utils.StringPointer("^*voice"), Mandatory: utils.BoolPointer(true)}, - &CdrFieldJsonCfg{Tag: utils.StringPointer("accid"), Field_id: utils.StringPointer(utils.ACCID), Type: utils.StringPointer(utils.META_COMPOSED), + &CdrFieldJsonCfg{Tag: utils.StringPointer("OriginID"), Field_id: utils.StringPointer(utils.ACCID), Type: utils.StringPointer(utils.META_COMPOSED), Value: utils.StringPointer("Session-Id"), Mandatory: utils.BoolPointer(true)}, - &CdrFieldJsonCfg{Tag: utils.StringPointer("reqtype"), Field_id: utils.StringPointer(utils.REQTYPE), Type: utils.StringPointer(utils.META_COMPOSED), + &CdrFieldJsonCfg{Tag: utils.StringPointer("ReqType"), Field_id: utils.StringPointer(utils.REQTYPE), Type: utils.StringPointer(utils.META_COMPOSED), Value: utils.StringPointer("^*users"), Mandatory: utils.BoolPointer(true)}, - &CdrFieldJsonCfg{Tag: utils.StringPointer("direction"), Field_id: utils.StringPointer(utils.DIRECTION), Type: utils.StringPointer(utils.META_COMPOSED), + &CdrFieldJsonCfg{Tag: utils.StringPointer("Direction"), Field_id: utils.StringPointer(utils.DIRECTION), Type: utils.StringPointer(utils.META_COMPOSED), Value: utils.StringPointer("^*out"), Mandatory: utils.BoolPointer(true)}, - &CdrFieldJsonCfg{Tag: utils.StringPointer("tenant"), Field_id: utils.StringPointer(utils.TENANT), Type: utils.StringPointer(utils.META_COMPOSED), + &CdrFieldJsonCfg{Tag: utils.StringPointer("Tenant"), Field_id: utils.StringPointer(utils.TENANT), Type: utils.StringPointer(utils.META_COMPOSED), Value: utils.StringPointer("^*users"), Mandatory: utils.BoolPointer(true)}, - &CdrFieldJsonCfg{Tag: utils.StringPointer("category"), Field_id: utils.StringPointer(utils.CATEGORY), Type: utils.StringPointer(utils.META_COMPOSED), + &CdrFieldJsonCfg{Tag: utils.StringPointer("Category"), Field_id: utils.StringPointer(utils.CATEGORY), Type: utils.StringPointer(utils.META_COMPOSED), Value: utils.StringPointer("^call"), Mandatory: utils.BoolPointer(true)}, - &CdrFieldJsonCfg{Tag: utils.StringPointer("account"), Field_id: utils.StringPointer(utils.ACCOUNT), Type: utils.StringPointer(utils.META_COMPOSED), + &CdrFieldJsonCfg{Tag: utils.StringPointer("Account"), Field_id: utils.StringPointer(utils.ACCOUNT), Type: utils.StringPointer(utils.META_COMPOSED), Value: utils.StringPointer("^*users"), Mandatory: utils.BoolPointer(true)}, - &CdrFieldJsonCfg{Tag: utils.StringPointer("subject"), Field_id: utils.StringPointer(utils.SUBJECT), Type: utils.StringPointer(utils.META_COMPOSED), + &CdrFieldJsonCfg{Tag: utils.StringPointer("Subject"), Field_id: utils.StringPointer(utils.SUBJECT), Type: utils.StringPointer(utils.META_COMPOSED), Value: utils.StringPointer("^*users"), Mandatory: utils.BoolPointer(true)}, - &CdrFieldJsonCfg{Tag: utils.StringPointer("destination"), Field_id: utils.StringPointer(utils.DESTINATION), Type: utils.StringPointer(utils.META_COMPOSED), + &CdrFieldJsonCfg{Tag: utils.StringPointer("Destination"), Field_id: utils.StringPointer(utils.DESTINATION), Type: utils.StringPointer(utils.META_COMPOSED), Value: utils.StringPointer("Service-Information>IN-Information>Real-Called-Number"), Mandatory: utils.BoolPointer(true)}, - &CdrFieldJsonCfg{Tag: utils.StringPointer("setup_time"), Field_id: utils.StringPointer(utils.SETUP_TIME), Type: utils.StringPointer(utils.META_COMPOSED), + &CdrFieldJsonCfg{Tag: utils.StringPointer("SetupTime"), Field_id: utils.StringPointer(utils.SETUP_TIME), Type: utils.StringPointer(utils.META_COMPOSED), Value: utils.StringPointer("Event-Timestamp"), Mandatory: utils.BoolPointer(true)}, - &CdrFieldJsonCfg{Tag: utils.StringPointer("answer_time"), Field_id: utils.StringPointer(utils.ANSWER_TIME), Type: utils.StringPointer(utils.META_COMPOSED), + &CdrFieldJsonCfg{Tag: utils.StringPointer("AnswerTime"), Field_id: utils.StringPointer(utils.ANSWER_TIME), Type: utils.StringPointer(utils.META_COMPOSED), Value: utils.StringPointer("Event-Timestamp"), Mandatory: utils.BoolPointer(true)}, - &CdrFieldJsonCfg{Tag: utils.StringPointer("usage"), Field_id: utils.StringPointer(utils.USAGE), Type: utils.StringPointer(utils.META_HANDLER), + &CdrFieldJsonCfg{Tag: utils.StringPointer("Usage"), Field_id: utils.StringPointer(utils.USAGE), Type: utils.StringPointer(utils.META_HANDLER), Handler_id: utils.StringPointer("*ccr_usage"), Mandatory: utils.BoolPointer(true)}, &CdrFieldJsonCfg{Tag: utils.StringPointer("subscriber_id"), Field_id: utils.StringPointer("SubscriberId"), Type: utils.StringPointer(utils.META_COMPOSED), Value: utils.StringPointer("Subscription-Id>Subscription-Id-Data"), Mandatory: utils.BoolPointer(true)}, @@ -544,7 +544,7 @@ func TestDfSureTaxJsonCfg(t *testing.T) { Response_group: utils.StringPointer("03"), Response_type: utils.StringPointer("D4"), Regulatory_code: utils.StringPointer("03"), - Client_tracking: utils.StringPointer("CgrId"), + Client_tracking: utils.StringPointer(utils.CGRID), Customer_number: utils.StringPointer("Subject"), Orig_number: utils.StringPointer("Subject"), Term_number: utils.StringPointer("Destination"), diff --git a/config/configcdrc_test.go b/config/configcdrc_test.go index 7acc357cf..44630efbe 100644 --- a/config/configcdrc_test.go +++ b/config/configcdrc_test.go @@ -51,29 +51,29 @@ func TestLoadCdrcConfigMultipleFiles(t *testing.T) { PartialRecordCache: time.Duration(10) * time.Second, HeaderFields: make([]*CfgCdrField, 0), ContentFields: []*CfgCdrField{ - &CfgCdrField{Tag: "tor", Type: utils.META_COMPOSED, FieldId: utils.TOR, Value: utils.ParseRSRFieldsMustCompile("2", utils.INFIELD_SEP), + &CfgCdrField{Tag: "TOR", Type: utils.META_COMPOSED, FieldId: utils.TOR, Value: utils.ParseRSRFieldsMustCompile("2", utils.INFIELD_SEP), FieldFilter: utils.ParseRSRFieldsMustCompile("", utils.INFIELD_SEP), Width: 0, Strip: "", Padding: "", Layout: "", Mandatory: true}, - &CfgCdrField{Tag: "accid", Type: utils.META_COMPOSED, FieldId: utils.ACCID, Value: utils.ParseRSRFieldsMustCompile("3", utils.INFIELD_SEP), + &CfgCdrField{Tag: "OriginID", Type: utils.META_COMPOSED, FieldId: utils.ACCID, Value: utils.ParseRSRFieldsMustCompile("3", utils.INFIELD_SEP), FieldFilter: utils.ParseRSRFieldsMustCompile("", utils.INFIELD_SEP), Width: 0, Strip: "", Padding: "", Layout: "", Mandatory: true}, - &CfgCdrField{Tag: "reqtype", Type: utils.META_COMPOSED, FieldId: utils.REQTYPE, Value: utils.ParseRSRFieldsMustCompile("4", utils.INFIELD_SEP), + &CfgCdrField{Tag: "ReqType", Type: utils.META_COMPOSED, FieldId: utils.REQTYPE, Value: utils.ParseRSRFieldsMustCompile("4", utils.INFIELD_SEP), FieldFilter: utils.ParseRSRFieldsMustCompile("", utils.INFIELD_SEP), Width: 0, Strip: "", Padding: "", Layout: "", Mandatory: true}, - &CfgCdrField{Tag: "direction", Type: utils.META_COMPOSED, FieldId: utils.DIRECTION, Value: utils.ParseRSRFieldsMustCompile("5", utils.INFIELD_SEP), + &CfgCdrField{Tag: "Direction", Type: utils.META_COMPOSED, FieldId: utils.DIRECTION, Value: utils.ParseRSRFieldsMustCompile("5", utils.INFIELD_SEP), FieldFilter: utils.ParseRSRFieldsMustCompile("", utils.INFIELD_SEP), Width: 0, Strip: "", Padding: "", Layout: "", Mandatory: true}, - &CfgCdrField{Tag: "tenant", Type: utils.META_COMPOSED, FieldId: utils.TENANT, Value: utils.ParseRSRFieldsMustCompile("6", utils.INFIELD_SEP), + &CfgCdrField{Tag: "Tenant", Type: utils.META_COMPOSED, FieldId: utils.TENANT, Value: utils.ParseRSRFieldsMustCompile("6", utils.INFIELD_SEP), FieldFilter: utils.ParseRSRFieldsMustCompile("", utils.INFIELD_SEP), Width: 0, Strip: "", Padding: "", Layout: "", Mandatory: true}, - &CfgCdrField{Tag: "category", Type: utils.META_COMPOSED, FieldId: utils.CATEGORY, Value: utils.ParseRSRFieldsMustCompile("7", utils.INFIELD_SEP), + &CfgCdrField{Tag: "Category", Type: utils.META_COMPOSED, FieldId: utils.CATEGORY, Value: utils.ParseRSRFieldsMustCompile("7", utils.INFIELD_SEP), FieldFilter: utils.ParseRSRFieldsMustCompile("", utils.INFIELD_SEP), Width: 0, Strip: "", Padding: "", Layout: "", Mandatory: true}, - &CfgCdrField{Tag: "account", Type: utils.META_COMPOSED, FieldId: utils.ACCOUNT, Value: utils.ParseRSRFieldsMustCompile("8", utils.INFIELD_SEP), + &CfgCdrField{Tag: "Account", Type: utils.META_COMPOSED, FieldId: utils.ACCOUNT, Value: utils.ParseRSRFieldsMustCompile("8", utils.INFIELD_SEP), FieldFilter: utils.ParseRSRFieldsMustCompile("", utils.INFIELD_SEP), Width: 0, Strip: "", Padding: "", Layout: "", Mandatory: true}, - &CfgCdrField{Tag: "subject", Type: utils.META_COMPOSED, FieldId: utils.SUBJECT, Value: utils.ParseRSRFieldsMustCompile("9", utils.INFIELD_SEP), + &CfgCdrField{Tag: "Subject", Type: utils.META_COMPOSED, FieldId: utils.SUBJECT, Value: utils.ParseRSRFieldsMustCompile("9", utils.INFIELD_SEP), FieldFilter: utils.ParseRSRFieldsMustCompile("", utils.INFIELD_SEP), Width: 0, Strip: "", Padding: "", Layout: "", Mandatory: true}, - &CfgCdrField{Tag: "destination", Type: utils.META_COMPOSED, FieldId: utils.DESTINATION, Value: utils.ParseRSRFieldsMustCompile("10", utils.INFIELD_SEP), + &CfgCdrField{Tag: "Destination", Type: utils.META_COMPOSED, FieldId: utils.DESTINATION, Value: utils.ParseRSRFieldsMustCompile("10", utils.INFIELD_SEP), FieldFilter: utils.ParseRSRFieldsMustCompile("", utils.INFIELD_SEP), Width: 0, Strip: "", Padding: "", Layout: "", Mandatory: true}, - &CfgCdrField{Tag: "setup_time", Type: utils.META_COMPOSED, FieldId: utils.SETUP_TIME, Value: utils.ParseRSRFieldsMustCompile("11", utils.INFIELD_SEP), + &CfgCdrField{Tag: "SetupTime", Type: utils.META_COMPOSED, FieldId: utils.SETUP_TIME, Value: utils.ParseRSRFieldsMustCompile("11", utils.INFIELD_SEP), FieldFilter: utils.ParseRSRFieldsMustCompile("", utils.INFIELD_SEP), Width: 0, Strip: "", Padding: "", Layout: "", Mandatory: true}, - &CfgCdrField{Tag: "answer_time", Type: utils.META_COMPOSED, FieldId: utils.ANSWER_TIME, Value: utils.ParseRSRFieldsMustCompile("12", utils.INFIELD_SEP), + &CfgCdrField{Tag: "AnswerTime", Type: utils.META_COMPOSED, FieldId: utils.ANSWER_TIME, Value: utils.ParseRSRFieldsMustCompile("12", utils.INFIELD_SEP), FieldFilter: utils.ParseRSRFieldsMustCompile("", utils.INFIELD_SEP), Width: 0, Strip: "", Padding: "", Layout: "", Mandatory: true}, - &CfgCdrField{Tag: "usage", Type: utils.META_COMPOSED, FieldId: utils.USAGE, Value: utils.ParseRSRFieldsMustCompile("13", utils.INFIELD_SEP), + &CfgCdrField{Tag: "Usage", Type: utils.META_COMPOSED, FieldId: utils.USAGE, Value: utils.ParseRSRFieldsMustCompile("13", utils.INFIELD_SEP), FieldFilter: utils.ParseRSRFieldsMustCompile("", utils.INFIELD_SEP), Width: 0, Strip: "", Padding: "", Layout: "", Mandatory: true}, }, TrailerFields: make([]*CfgCdrField, 0), @@ -94,29 +94,29 @@ func TestLoadCdrcConfigMultipleFiles(t *testing.T) { CdrFilter: utils.ParseRSRFieldsMustCompile("", utils.INFIELD_SEP), HeaderFields: make([]*CfgCdrField, 0), ContentFields: []*CfgCdrField{ - &CfgCdrField{Tag: "tor", Type: utils.META_COMPOSED, FieldId: utils.TOR, Value: utils.ParseRSRFieldsMustCompile("2", utils.INFIELD_SEP), + &CfgCdrField{Tag: "TOR", Type: utils.META_COMPOSED, FieldId: utils.TOR, Value: utils.ParseRSRFieldsMustCompile("2", utils.INFIELD_SEP), FieldFilter: utils.ParseRSRFieldsMustCompile("", utils.INFIELD_SEP), Width: 0, Strip: "", Padding: "", Layout: "", Mandatory: true}, - &CfgCdrField{Tag: "accid", Type: utils.META_COMPOSED, FieldId: utils.ACCID, Value: utils.ParseRSRFieldsMustCompile("3", utils.INFIELD_SEP), + &CfgCdrField{Tag: "OriginID", Type: utils.META_COMPOSED, FieldId: utils.ACCID, Value: utils.ParseRSRFieldsMustCompile("3", utils.INFIELD_SEP), FieldFilter: utils.ParseRSRFieldsMustCompile("", utils.INFIELD_SEP), Width: 0, Strip: "", Padding: "", Layout: "", Mandatory: true}, - &CfgCdrField{Tag: "reqtype", Type: utils.META_COMPOSED, FieldId: utils.REQTYPE, Value: utils.ParseRSRFieldsMustCompile("4", utils.INFIELD_SEP), + &CfgCdrField{Tag: "ReqType", Type: utils.META_COMPOSED, FieldId: utils.REQTYPE, Value: utils.ParseRSRFieldsMustCompile("4", utils.INFIELD_SEP), FieldFilter: utils.ParseRSRFieldsMustCompile("", utils.INFIELD_SEP), Width: 0, Strip: "", Padding: "", Layout: "", Mandatory: true}, - &CfgCdrField{Tag: "direction", Type: utils.META_COMPOSED, FieldId: utils.DIRECTION, Value: utils.ParseRSRFieldsMustCompile("5", utils.INFIELD_SEP), + &CfgCdrField{Tag: "Direction", Type: utils.META_COMPOSED, FieldId: utils.DIRECTION, Value: utils.ParseRSRFieldsMustCompile("5", utils.INFIELD_SEP), FieldFilter: utils.ParseRSRFieldsMustCompile("", utils.INFIELD_SEP), Width: 0, Strip: "", Padding: "", Layout: "", Mandatory: true}, - &CfgCdrField{Tag: "tenant", Type: utils.META_COMPOSED, FieldId: utils.TENANT, Value: utils.ParseRSRFieldsMustCompile("6", utils.INFIELD_SEP), + &CfgCdrField{Tag: "Tenant", Type: utils.META_COMPOSED, FieldId: utils.TENANT, Value: utils.ParseRSRFieldsMustCompile("6", utils.INFIELD_SEP), FieldFilter: utils.ParseRSRFieldsMustCompile("", utils.INFIELD_SEP), Width: 0, Strip: "", Padding: "", Layout: "", Mandatory: true}, - &CfgCdrField{Tag: "category", Type: utils.META_COMPOSED, FieldId: utils.CATEGORY, Value: utils.ParseRSRFieldsMustCompile("7", utils.INFIELD_SEP), + &CfgCdrField{Tag: "Category", Type: utils.META_COMPOSED, FieldId: utils.CATEGORY, Value: utils.ParseRSRFieldsMustCompile("7", utils.INFIELD_SEP), FieldFilter: utils.ParseRSRFieldsMustCompile("", utils.INFIELD_SEP), Width: 0, Strip: "", Padding: "", Layout: "", Mandatory: true}, - &CfgCdrField{Tag: "account", Type: utils.META_COMPOSED, FieldId: utils.ACCOUNT, Value: utils.ParseRSRFieldsMustCompile("8", utils.INFIELD_SEP), + &CfgCdrField{Tag: "Account", Type: utils.META_COMPOSED, FieldId: utils.ACCOUNT, Value: utils.ParseRSRFieldsMustCompile("8", utils.INFIELD_SEP), FieldFilter: utils.ParseRSRFieldsMustCompile("", utils.INFIELD_SEP), Width: 0, Strip: "", Padding: "", Layout: "", Mandatory: true}, - &CfgCdrField{Tag: "subject", Type: utils.META_COMPOSED, FieldId: utils.SUBJECT, Value: utils.ParseRSRFieldsMustCompile("9", utils.INFIELD_SEP), + &CfgCdrField{Tag: "Subject", Type: utils.META_COMPOSED, FieldId: utils.SUBJECT, Value: utils.ParseRSRFieldsMustCompile("9", utils.INFIELD_SEP), FieldFilter: utils.ParseRSRFieldsMustCompile("", utils.INFIELD_SEP), Width: 0, Strip: "", Padding: "", Layout: "", Mandatory: true}, - &CfgCdrField{Tag: "destination", Type: utils.META_COMPOSED, FieldId: utils.DESTINATION, Value: utils.ParseRSRFieldsMustCompile("10", utils.INFIELD_SEP), + &CfgCdrField{Tag: "Destination", Type: utils.META_COMPOSED, FieldId: utils.DESTINATION, Value: utils.ParseRSRFieldsMustCompile("10", utils.INFIELD_SEP), FieldFilter: utils.ParseRSRFieldsMustCompile("", utils.INFIELD_SEP), Width: 0, Strip: "", Padding: "", Layout: "", Mandatory: true}, - &CfgCdrField{Tag: "setup_time", Type: utils.META_COMPOSED, FieldId: utils.SETUP_TIME, Value: utils.ParseRSRFieldsMustCompile("11", utils.INFIELD_SEP), + &CfgCdrField{Tag: "SetupTime", Type: utils.META_COMPOSED, FieldId: utils.SETUP_TIME, Value: utils.ParseRSRFieldsMustCompile("11", utils.INFIELD_SEP), FieldFilter: utils.ParseRSRFieldsMustCompile("", utils.INFIELD_SEP), Width: 0, Strip: "", Padding: "", Layout: "", Mandatory: true}, - &CfgCdrField{Tag: "answer_time", Type: utils.META_COMPOSED, FieldId: utils.ANSWER_TIME, Value: utils.ParseRSRFieldsMustCompile("12", utils.INFIELD_SEP), + &CfgCdrField{Tag: "AnswerTime", Type: utils.META_COMPOSED, FieldId: utils.ANSWER_TIME, Value: utils.ParseRSRFieldsMustCompile("12", utils.INFIELD_SEP), FieldFilter: utils.ParseRSRFieldsMustCompile("", utils.INFIELD_SEP), Width: 0, Strip: "", Padding: "", Layout: "", Mandatory: true}, - &CfgCdrField{Tag: "usage", Type: utils.META_COMPOSED, FieldId: utils.USAGE, Value: utils.ParseRSRFieldsMustCompile("13", utils.INFIELD_SEP), + &CfgCdrField{Tag: "Usage", Type: utils.META_COMPOSED, FieldId: utils.USAGE, Value: utils.ParseRSRFieldsMustCompile("13", utils.INFIELD_SEP), FieldFilter: utils.ParseRSRFieldsMustCompile("", utils.INFIELD_SEP), Width: 0, Strip: "", Padding: "", Layout: "", Mandatory: true}, }, TrailerFields: make([]*CfgCdrField, 0), @@ -160,29 +160,29 @@ func TestLoadCdrcConfigMultipleFiles(t *testing.T) { CdrFilter: utils.ParseRSRFieldsMustCompile("", utils.INFIELD_SEP), HeaderFields: make([]*CfgCdrField, 0), ContentFields: []*CfgCdrField{ - &CfgCdrField{Tag: "tor", Type: utils.META_COMPOSED, FieldId: utils.TOR, Value: utils.ParseRSRFieldsMustCompile("2", utils.INFIELD_SEP), + &CfgCdrField{Tag: "TOR", Type: utils.META_COMPOSED, FieldId: utils.TOR, Value: utils.ParseRSRFieldsMustCompile("2", utils.INFIELD_SEP), FieldFilter: utils.ParseRSRFieldsMustCompile("", utils.INFIELD_SEP), Width: 0, Strip: "", Padding: "", Layout: "", Mandatory: true}, - &CfgCdrField{Tag: "accid", Type: utils.META_COMPOSED, FieldId: utils.ACCID, Value: utils.ParseRSRFieldsMustCompile("3", utils.INFIELD_SEP), + &CfgCdrField{Tag: "OriginID", Type: utils.META_COMPOSED, FieldId: utils.ACCID, Value: utils.ParseRSRFieldsMustCompile("3", utils.INFIELD_SEP), FieldFilter: utils.ParseRSRFieldsMustCompile("", utils.INFIELD_SEP), Width: 0, Strip: "", Padding: "", Layout: "", Mandatory: true}, - &CfgCdrField{Tag: "reqtype", Type: utils.META_COMPOSED, FieldId: utils.REQTYPE, Value: utils.ParseRSRFieldsMustCompile("4", utils.INFIELD_SEP), + &CfgCdrField{Tag: "ReqType", Type: utils.META_COMPOSED, FieldId: utils.REQTYPE, Value: utils.ParseRSRFieldsMustCompile("4", utils.INFIELD_SEP), FieldFilter: utils.ParseRSRFieldsMustCompile("", utils.INFIELD_SEP), Width: 0, Strip: "", Padding: "", Layout: "", Mandatory: true}, - &CfgCdrField{Tag: "direction", Type: utils.META_COMPOSED, FieldId: utils.DIRECTION, Value: utils.ParseRSRFieldsMustCompile("5", utils.INFIELD_SEP), + &CfgCdrField{Tag: "Direction", Type: utils.META_COMPOSED, FieldId: utils.DIRECTION, Value: utils.ParseRSRFieldsMustCompile("5", utils.INFIELD_SEP), FieldFilter: utils.ParseRSRFieldsMustCompile("", utils.INFIELD_SEP), Width: 0, Strip: "", Padding: "", Layout: "", Mandatory: true}, - &CfgCdrField{Tag: "tenant", Type: utils.META_COMPOSED, FieldId: utils.TENANT, Value: utils.ParseRSRFieldsMustCompile("6", utils.INFIELD_SEP), + &CfgCdrField{Tag: "Tenant", Type: utils.META_COMPOSED, FieldId: utils.TENANT, Value: utils.ParseRSRFieldsMustCompile("6", utils.INFIELD_SEP), FieldFilter: utils.ParseRSRFieldsMustCompile("", utils.INFIELD_SEP), Width: 0, Strip: "", Padding: "", Layout: "", Mandatory: true}, - &CfgCdrField{Tag: "category", Type: utils.META_COMPOSED, FieldId: utils.CATEGORY, Value: utils.ParseRSRFieldsMustCompile("7", utils.INFIELD_SEP), + &CfgCdrField{Tag: "Category", Type: utils.META_COMPOSED, FieldId: utils.CATEGORY, Value: utils.ParseRSRFieldsMustCompile("7", utils.INFIELD_SEP), FieldFilter: utils.ParseRSRFieldsMustCompile("", utils.INFIELD_SEP), Width: 0, Strip: "", Padding: "", Layout: "", Mandatory: true}, - &CfgCdrField{Tag: "account", Type: utils.META_COMPOSED, FieldId: utils.ACCOUNT, Value: utils.ParseRSRFieldsMustCompile("8", utils.INFIELD_SEP), + &CfgCdrField{Tag: "Account", Type: utils.META_COMPOSED, FieldId: utils.ACCOUNT, Value: utils.ParseRSRFieldsMustCompile("8", utils.INFIELD_SEP), FieldFilter: utils.ParseRSRFieldsMustCompile("", utils.INFIELD_SEP), Width: 0, Strip: "", Padding: "", Layout: "", Mandatory: true}, - &CfgCdrField{Tag: "subject", Type: utils.META_COMPOSED, FieldId: utils.SUBJECT, Value: utils.ParseRSRFieldsMustCompile("9", utils.INFIELD_SEP), + &CfgCdrField{Tag: "Subject", Type: utils.META_COMPOSED, FieldId: utils.SUBJECT, Value: utils.ParseRSRFieldsMustCompile("9", utils.INFIELD_SEP), FieldFilter: utils.ParseRSRFieldsMustCompile("", utils.INFIELD_SEP), Width: 0, Strip: "", Padding: "", Layout: "", Mandatory: true}, - &CfgCdrField{Tag: "destination", Type: utils.META_COMPOSED, FieldId: utils.DESTINATION, Value: utils.ParseRSRFieldsMustCompile("10", utils.INFIELD_SEP), + &CfgCdrField{Tag: "Destination", Type: utils.META_COMPOSED, FieldId: utils.DESTINATION, Value: utils.ParseRSRFieldsMustCompile("10", utils.INFIELD_SEP), FieldFilter: utils.ParseRSRFieldsMustCompile("", utils.INFIELD_SEP), Width: 0, Strip: "", Padding: "", Layout: "", Mandatory: true}, - &CfgCdrField{Tag: "setup_time", Type: utils.META_COMPOSED, FieldId: utils.SETUP_TIME, Value: utils.ParseRSRFieldsMustCompile("11", utils.INFIELD_SEP), + &CfgCdrField{Tag: "SetupTime", Type: utils.META_COMPOSED, FieldId: utils.SETUP_TIME, Value: utils.ParseRSRFieldsMustCompile("11", utils.INFIELD_SEP), FieldFilter: utils.ParseRSRFieldsMustCompile("", utils.INFIELD_SEP), Width: 0, Strip: "", Padding: "", Layout: "", Mandatory: true}, - &CfgCdrField{Tag: "answer_time", Type: utils.META_COMPOSED, FieldId: utils.ANSWER_TIME, Value: utils.ParseRSRFieldsMustCompile("12", utils.INFIELD_SEP), + &CfgCdrField{Tag: "AnswerTime", Type: utils.META_COMPOSED, FieldId: utils.ANSWER_TIME, Value: utils.ParseRSRFieldsMustCompile("12", utils.INFIELD_SEP), FieldFilter: utils.ParseRSRFieldsMustCompile("", utils.INFIELD_SEP), Width: 0, Strip: "", Padding: "", Layout: "", Mandatory: true}, - &CfgCdrField{Tag: "usage", Type: utils.META_COMPOSED, FieldId: utils.USAGE, Value: utils.ParseRSRFieldsMustCompile("13", utils.INFIELD_SEP), + &CfgCdrField{Tag: "Usage", Type: utils.META_COMPOSED, FieldId: utils.USAGE, Value: utils.ParseRSRFieldsMustCompile("13", utils.INFIELD_SEP), FieldFilter: utils.ParseRSRFieldsMustCompile("", utils.INFIELD_SEP), Width: 0, Strip: "", Padding: "", Layout: "", Mandatory: true}, }, TrailerFields: make([]*CfgCdrField, 0), diff --git a/config/libconfig_json.go b/config/libconfig_json.go index 82240478d..f572e2463 100644 --- a/config/libconfig_json.go +++ b/config/libconfig_json.go @@ -131,7 +131,7 @@ type CdreJsonCfg struct { Cost_shift_digits *int Mask_destination_id *string Mask_length *int - Export_dir *string + Export_folder *string Header_fields *[]*CdrFieldJsonCfg Content_fields *[]*CdrFieldJsonCfg Trailer_fields *[]*CdrFieldJsonCfg diff --git a/engine/action.go b/engine/action.go index a3f6a640a..11ee21af2 100644 --- a/engine/action.go +++ b/engine/action.go @@ -195,15 +195,15 @@ func parseTemplateValue(rsrFlds utils.RSRFields, acnt *Account, action *Action) func cdrLogAction(acc *Account, sq *StatsQueueTriggered, a *Action, acs Actions) (err error) { defaultTemplate := map[string]utils.RSRFields{ - "TOR": utils.ParseRSRFieldsMustCompile("balance_type", utils.INFIELD_SEP), - "CdrHost": utils.ParseRSRFieldsMustCompile("^127.0.0.1", utils.INFIELD_SEP), - "Direction": utils.ParseRSRFieldsMustCompile("direction", utils.INFIELD_SEP), - "ReqType": utils.ParseRSRFieldsMustCompile("^"+utils.META_PREPAID, utils.INFIELD_SEP), - "Tenant": utils.ParseRSRFieldsMustCompile("tenant", utils.INFIELD_SEP), - "Account": utils.ParseRSRFieldsMustCompile("account", utils.INFIELD_SEP), - "Subject": utils.ParseRSRFieldsMustCompile("account", utils.INFIELD_SEP), - "Cost": utils.ParseRSRFieldsMustCompile("balance_value", utils.INFIELD_SEP), - "MediationRunId": utils.ParseRSRFieldsMustCompile("^"+utils.META_DEFAULT, utils.INFIELD_SEP), + utils.TOR: utils.ParseRSRFieldsMustCompile("balance_type", utils.INFIELD_SEP), + utils.CDRHOST: utils.ParseRSRFieldsMustCompile("^127.0.0.1", utils.INFIELD_SEP), + utils.DIRECTION: utils.ParseRSRFieldsMustCompile("direction", utils.INFIELD_SEP), + utils.REQTYPE: utils.ParseRSRFieldsMustCompile("^"+utils.META_PREPAID, utils.INFIELD_SEP), + utils.TENANT: utils.ParseRSRFieldsMustCompile("tenant", utils.INFIELD_SEP), + utils.ACCOUNT: utils.ParseRSRFieldsMustCompile("account", utils.INFIELD_SEP), + utils.SUBJECT: utils.ParseRSRFieldsMustCompile("account", utils.INFIELD_SEP), + utils.COST: utils.ParseRSRFieldsMustCompile("balance_value", utils.INFIELD_SEP), + utils.MEDI_RUNID: utils.ParseRSRFieldsMustCompile("^"+utils.META_DEFAULT, utils.INFIELD_SEP), } template := make(map[string]string) @@ -221,13 +221,13 @@ func cdrLogAction(acc *Account, sq *StatsQueueTriggered, a *Action, acs Actions) } // set stored cdr values - var cdrs []*StoredCdr + var cdrs []*CDR for _, action := range acs { if !utils.IsSliceMember([]string{DEBIT, DEBIT_RESET}, action.ActionType) || action.Balance == nil { continue // Only log specific actions } - cdr := &StoredCdr{CdrSource: CDRLOG, SetupTime: time.Now(), AnswerTime: time.Now(), AccId: utils.GenUUID(), ExtraFields: make(map[string]string)} - cdr.CgrId = utils.Sha1(cdr.AccId, cdr.SetupTime.String()) + cdr := &CDR{Source: CDRLOG, SetupTime: time.Now(), AnswerTime: time.Now(), OriginID: utils.GenUUID(), ExtraFields: make(map[string]string)} + cdr.CGRID = utils.Sha1(cdr.OriginID, cdr.SetupTime.String()) cdr.Usage = time.Duration(1) * time.Second elem := reflect.ValueOf(cdr).Elem() for key, rsrFlds := range defaultTemplate { diff --git a/engine/actions_local_test.go b/engine/actions_local_test.go index eea4919f8..2a78979fd 100644 --- a/engine/actions_local_test.go +++ b/engine/actions_local_test.go @@ -105,20 +105,20 @@ func TestActionsLocalSetCdrlogActions(t *testing.T) { } else if reply != utils.OK { t.Errorf("Calling ApierV1.ExecuteAction received: %s", reply) } - var rcvedCdrs []*ExternalCdr - if err := actsLclRpc.Call("ApierV2.GetCdrs", utils.RpcCdrsFilter{CdrSources: []string{CDRLOG}}, &rcvedCdrs); err != nil { + var rcvedCdrs []*ExternalCDR + if err := actsLclRpc.Call("ApierV2.GetCdrs", utils.RPCCDRsFilter{Sources: []string{CDRLOG}}, &rcvedCdrs); err != nil { t.Error("Unexpected error: ", err.Error()) } else if len(rcvedCdrs) != 1 { t.Error("Unexpected number of CDRs returned: ", len(rcvedCdrs)) } else if rcvedCdrs[0].TOR != utils.MONETARY || - rcvedCdrs[0].CdrHost != "127.0.0.1" || - rcvedCdrs[0].CdrSource != CDRLOG || + rcvedCdrs[0].OriginHost != "127.0.0.1" || + rcvedCdrs[0].Source != CDRLOG || rcvedCdrs[0].ReqType != utils.META_PREPAID || rcvedCdrs[0].Tenant != "cgrates.org" || rcvedCdrs[0].Account != "dan2904" || rcvedCdrs[0].Subject != "dan2904" || rcvedCdrs[0].Usage != "1" || - rcvedCdrs[0].MediationRunId != utils.META_DEFAULT || + rcvedCdrs[0].RunID != utils.META_DEFAULT || rcvedCdrs[0].Cost != attrsAA.Actions[0].Units { t.Errorf("Received: %+v", rcvedCdrs[0]) } diff --git a/engine/actions_test.go b/engine/actions_test.go index d3799f35d..1dfb27283 100644 --- a/engine/actions_test.go +++ b/engine/actions_test.go @@ -1164,9 +1164,9 @@ func TestActionCdrlogEmpty(t *testing.T) { if err != nil { t.Error("Error performing cdrlog action: ", err) } - cdrs := make([]*StoredCdr, 0) + cdrs := make([]*CDR, 0) json.Unmarshal([]byte(cdrlog.ExpirationString), &cdrs) - if len(cdrs) != 1 || cdrs[0].CdrSource != CDRLOG { + if len(cdrs) != 1 || cdrs[0].Source != CDRLOG { t.Errorf("Wrong cdrlogs: %+v", cdrs[0]) } } @@ -1190,7 +1190,7 @@ func TestActionCdrlogWithParams(t *testing.T) { if err != nil { t.Error("Error performing cdrlog action: ", err) } - cdrs := make([]*StoredCdr, 0) + cdrs := make([]*CDR, 0) json.Unmarshal([]byte(cdrlog.ExpirationString), &cdrs) if len(cdrs) != 2 || cdrs[0].Subject != "rif" { @@ -1217,7 +1217,7 @@ func TestActionCdrLogParamsWithOverload(t *testing.T) { if err != nil { t.Error("Error performing cdrlog action: ", err) } - cdrs := make([]*StoredCdr, 0) + cdrs := make([]*CDR, 0) json.Unmarshal([]byte(cdrlog.ExpirationString), &cdrs) expectedExtraFields := map[string]string{ "AccountId": "cgrates.org:dan2904", diff --git a/engine/storedcdr.go b/engine/cdr.go similarity index 53% rename from engine/storedcdr.go rename to engine/cdr.go index 8c45f4c71..525080b3d 100644 --- a/engine/storedcdr.go +++ b/engine/cdr.go @@ -31,55 +31,54 @@ import ( "github.com/cgrates/cgrates/utils" ) -func NewStoredCdrFromExternalCdr(extCdr *ExternalCdr, timezone string) (*StoredCdr, error) { +func NewCDRFromExternalCDR(extCdr *ExternalCDR, timezone string) (*CDR, error) { var err error - storedCdr := &StoredCdr{CgrId: extCdr.CgrId, OrderId: extCdr.OrderId, TOR: extCdr.TOR, AccId: extCdr.AccId, CdrHost: extCdr.CdrHost, CdrSource: extCdr.CdrSource, + cdr := &CDR{CGRID: extCdr.CGRID, OrderID: extCdr.OrderID, TOR: extCdr.TOR, OriginID: extCdr.OriginID, OriginHost: extCdr.OriginHost, Source: extCdr.Source, ReqType: extCdr.ReqType, Direction: extCdr.Direction, Tenant: extCdr.Tenant, Category: extCdr.Category, Account: extCdr.Account, Subject: extCdr.Subject, Destination: extCdr.Destination, Supplier: extCdr.Supplier, DisconnectCause: extCdr.DisconnectCause, - MediationRunId: extCdr.MediationRunId, RatedAccount: extCdr.RatedAccount, RatedSubject: extCdr.RatedSubject, Cost: extCdr.Cost, Rated: extCdr.Rated} - if storedCdr.SetupTime, err = utils.ParseTimeDetectLayout(extCdr.SetupTime, timezone); err != nil { + RunID: extCdr.RunID, Cost: extCdr.Cost, Rated: extCdr.Rated} + if cdr.SetupTime, err = utils.ParseTimeDetectLayout(extCdr.SetupTime, timezone); err != nil { return nil, err } - if len(storedCdr.CgrId) == 0 { // Populate CgrId if not present - storedCdr.CgrId = utils.Sha1(storedCdr.AccId, storedCdr.SetupTime.UTC().String()) + if len(cdr.CGRID) == 0 { // Populate CGRID if not present + cdr.CGRID = utils.Sha1(cdr.OriginID, cdr.SetupTime.UTC().String()) } - if storedCdr.AnswerTime, err = utils.ParseTimeDetectLayout(extCdr.AnswerTime, timezone); err != nil { + if cdr.AnswerTime, err = utils.ParseTimeDetectLayout(extCdr.AnswerTime, timezone); err != nil { return nil, err } - if storedCdr.Usage, err = utils.ParseDurationWithSecs(extCdr.Usage); err != nil { + if cdr.Usage, err = utils.ParseDurationWithSecs(extCdr.Usage); err != nil { return nil, err } - if storedCdr.Pdd, err = utils.ParseDurationWithSecs(extCdr.Pdd); err != nil { + if cdr.PDD, err = utils.ParseDurationWithSecs(extCdr.PDD); err != nil { return nil, err } if len(extCdr.CostDetails) != 0 { - if err = json.Unmarshal([]byte(extCdr.CostDetails), storedCdr.CostDetails); err != nil { + if err = json.Unmarshal([]byte(extCdr.CostDetails), cdr.CostDetails); err != nil { return nil, err } } if extCdr.ExtraFields != nil { - storedCdr.ExtraFields = make(map[string]string) + cdr.ExtraFields = make(map[string]string) } for k, v := range extCdr.ExtraFields { - storedCdr.ExtraFields[k] = v + cdr.ExtraFields[k] = v } - return storedCdr, nil + return cdr, nil } -// ToDo: split config to only add here general section -func NewStoredCdrWithDefaults(cfg *config.CGRConfig) *StoredCdr { - return &StoredCdr{TOR: utils.VOICE, ReqType: cfg.DefaultReqType, Direction: utils.OUT, Tenant: cfg.DefaultTenant, Category: cfg.DefaultCategory, +func NewCDRWithDefaults(cfg *config.CGRConfig) *CDR { + return &CDR{TOR: utils.VOICE, ReqType: cfg.DefaultReqType, Direction: utils.OUT, Tenant: cfg.DefaultTenant, Category: cfg.DefaultCategory, ExtraFields: make(map[string]string), Cost: -1} } -// Kinda standard of internal CDR, complies to CDR interface also -type StoredCdr struct { - CgrId string - OrderId int64 // Stor order id used as export order id +type CDR struct { + CGRID string + RunID string + OrderID int64 // Stor order id used as export order id + OriginHost string // represents the IP address of the host generating the CDR (automatically populated by the server) + Source string // formally identifies the source of the CDR (free form field) + OriginID string // represents the unique accounting id given by the telecom switch generating the CDR TOR string // type of record, meta-field, should map to one of the TORs hardcoded inside the server <*voice|*data|*sms|*generic> - AccId string // represents the unique accounting id given by the telecom switch generating the CDR - CdrHost string // represents the IP address of the host generating the CDR (automatically populated by the server) - CdrSource string // formally identifies the source of the CDR (free form field) ReqType string // matching the supported request types by the **CGRateS**, accepted values are hardcoded in the server . Direction string // matching the supported direction identifiers of the CGRateS <*out> Tenant string // tenant whom this record belongs @@ -88,42 +87,39 @@ type StoredCdr struct { Subject string // rating subject (rating subsystem) this record should be attached to Destination string // destination to be charged SetupTime time.Time // set-up time of the event. Supported formats: datetime RFC3339 compatible, SQL datetime (eg: MySQL), unix timestamp. - Pdd time.Duration // PDD value + PDD time.Duration // PDD value AnswerTime time.Time // answer time of the event. Supported formats: datetime RFC3339 compatible, SQL datetime (eg: MySQL), unix timestamp. Usage time.Duration // event usage information (eg: in case of tor=*voice this will represent the total duration of a call) Supplier string // Supplier information when available DisconnectCause string // Disconnect cause of the event ExtraFields map[string]string // Extra fields to be stored in CDR - MediationRunId string - RatedAccount string // Populated out of rating data - RatedSubject string Cost float64 ExtraInfo string // Container for extra information related to this CDR, eg: populated with error reason in case of error on calculation CostDetails *CallCost // Attach the cost details to CDR when possible - Rated bool // Mark the CDR as rated so we do not process it during mediation + Rated bool // Mark the CDR as rated so we do not process it during rating } -func (storedCdr *StoredCdr) CostDetailsJson() string { - if storedCdr.CostDetails == nil { +func (cdr *CDR) CostDetailsJson() string { + if cdr.CostDetails == nil { return "" } - mrshled, _ := json.Marshal(storedCdr.CostDetails) + mrshled, _ := json.Marshal(cdr.CostDetails) return string(mrshled) } // Used to multiply usage on export -func (storedCdr *StoredCdr) UsageMultiply(multiplyFactor float64, roundDecimals int) { - storedCdr.Usage = time.Duration(int(utils.Round(float64(storedCdr.Usage.Nanoseconds())*multiplyFactor, roundDecimals, utils.ROUNDING_MIDDLE))) // Rounding down could introduce a slight loss here but only at nanoseconds level +func (cdr *CDR) UsageMultiply(multiplyFactor float64, roundDecimals int) { + cdr.Usage = time.Duration(int(utils.Round(float64(cdr.Usage.Nanoseconds())*multiplyFactor, roundDecimals, utils.ROUNDING_MIDDLE))) // Rounding down could introduce a slight loss here but only at nanoseconds level } // Used to multiply cost on export -func (storedCdr *StoredCdr) CostMultiply(multiplyFactor float64, roundDecimals int) { - storedCdr.Cost = utils.Round(storedCdr.Cost*multiplyFactor, roundDecimals, utils.ROUNDING_MIDDLE) +func (cdr *CDR) CostMultiply(multiplyFactor float64, roundDecimals int) { + cdr.Cost = utils.Round(cdr.Cost*multiplyFactor, roundDecimals, utils.ROUNDING_MIDDLE) } // Format cost as string on export -func (storedCdr *StoredCdr) FormatCost(shiftDecimals, roundDecimals int) string { - cost := storedCdr.Cost +func (cdr *CDR) FormatCost(shiftDecimals, roundDecimals int) string { + cost := cdr.Cost if shiftDecimals != 0 { cost = cost * math.Pow10(shiftDecimals) } @@ -131,211 +127,199 @@ func (storedCdr *StoredCdr) FormatCost(shiftDecimals, roundDecimals int) string } // Formats usage on export -func (storedCdr *StoredCdr) FormatUsage(layout string) string { - if utils.IsSliceMember([]string{utils.DATA, utils.SMS, utils.GENERIC}, storedCdr.TOR) { - return strconv.FormatFloat(utils.Round(storedCdr.Usage.Seconds(), 0, utils.ROUNDING_MIDDLE), 'f', -1, 64) +func (cdr *CDR) FormatUsage(layout string) string { + if utils.IsSliceMember([]string{utils.DATA, utils.SMS, utils.GENERIC}, cdr.TOR) { + return strconv.FormatFloat(utils.Round(cdr.Usage.Seconds(), 0, utils.ROUNDING_MIDDLE), 'f', -1, 64) } switch layout { default: - return strconv.FormatFloat(float64(storedCdr.Usage.Nanoseconds())/1000000000, 'f', -1, 64) + return strconv.FormatFloat(float64(cdr.Usage.Nanoseconds())/1000000000, 'f', -1, 64) } } // Used to retrieve fields as string, primary fields are const labeled -func (storedCdr *StoredCdr) FieldAsString(rsrFld *utils.RSRField) string { +func (cdr *CDR) FieldAsString(rsrFld *utils.RSRField) string { if rsrFld.IsStatic() { // Static values do not care about headers return rsrFld.ParseValue("") } switch rsrFld.Id { case utils.CGRID: - return rsrFld.ParseValue(storedCdr.CgrId) + return rsrFld.ParseValue(cdr.CGRID) case utils.ORDERID: - return rsrFld.ParseValue(strconv.FormatInt(storedCdr.OrderId, 10)) + return rsrFld.ParseValue(strconv.FormatInt(cdr.OrderID, 10)) case utils.TOR: - return rsrFld.ParseValue(storedCdr.TOR) + return rsrFld.ParseValue(cdr.TOR) case utils.ACCID: - return rsrFld.ParseValue(storedCdr.AccId) + return rsrFld.ParseValue(cdr.OriginID) case utils.CDRHOST: - return rsrFld.ParseValue(storedCdr.CdrHost) + return rsrFld.ParseValue(cdr.OriginHost) case utils.CDRSOURCE: - return rsrFld.ParseValue(storedCdr.CdrSource) + return rsrFld.ParseValue(cdr.Source) case utils.REQTYPE: - return rsrFld.ParseValue(storedCdr.ReqType) + return rsrFld.ParseValue(cdr.ReqType) case utils.DIRECTION: - return rsrFld.ParseValue(storedCdr.Direction) + return rsrFld.ParseValue(cdr.Direction) case utils.TENANT: - return rsrFld.ParseValue(storedCdr.Tenant) + return rsrFld.ParseValue(cdr.Tenant) case utils.CATEGORY: - return rsrFld.ParseValue(storedCdr.Category) + return rsrFld.ParseValue(cdr.Category) case utils.ACCOUNT: - return rsrFld.ParseValue(storedCdr.Account) + return rsrFld.ParseValue(cdr.Account) case utils.SUBJECT: - return rsrFld.ParseValue(storedCdr.Subject) + return rsrFld.ParseValue(cdr.Subject) case utils.DESTINATION: - return rsrFld.ParseValue(storedCdr.Destination) + return rsrFld.ParseValue(cdr.Destination) case utils.SETUP_TIME: - return rsrFld.ParseValue(storedCdr.SetupTime.Format(time.RFC3339)) + return rsrFld.ParseValue(cdr.SetupTime.Format(time.RFC3339)) case utils.PDD: - return strconv.FormatFloat(storedCdr.Pdd.Seconds(), 'f', -1, 64) + return strconv.FormatFloat(cdr.PDD.Seconds(), 'f', -1, 64) case utils.ANSWER_TIME: - return rsrFld.ParseValue(storedCdr.AnswerTime.Format(time.RFC3339)) + return rsrFld.ParseValue(cdr.AnswerTime.Format(time.RFC3339)) case utils.USAGE: - return strconv.FormatFloat(storedCdr.Usage.Seconds(), 'f', -1, 64) + return strconv.FormatFloat(cdr.Usage.Seconds(), 'f', -1, 64) case utils.SUPPLIER: - return rsrFld.ParseValue(storedCdr.Supplier) + return rsrFld.ParseValue(cdr.Supplier) case utils.DISCONNECT_CAUSE: - return rsrFld.ParseValue(storedCdr.DisconnectCause) + return rsrFld.ParseValue(cdr.DisconnectCause) case utils.MEDI_RUNID: - return rsrFld.ParseValue(storedCdr.MediationRunId) - case utils.RATED_ACCOUNT: - return rsrFld.ParseValue(storedCdr.RatedAccount) - case utils.RATED_SUBJECT: - return rsrFld.ParseValue(storedCdr.RatedSubject) + return rsrFld.ParseValue(cdr.RunID) case utils.RATED_FLD: - return rsrFld.ParseValue(strconv.FormatBool(storedCdr.Rated)) + return rsrFld.ParseValue(strconv.FormatBool(cdr.Rated)) case utils.COST: - return rsrFld.ParseValue(strconv.FormatFloat(storedCdr.Cost, 'f', -1, 64)) // Recommended to use FormatCost + return rsrFld.ParseValue(strconv.FormatFloat(cdr.Cost, 'f', -1, 64)) // Recommended to use FormatCost case utils.COST_DETAILS: - return rsrFld.ParseValue(storedCdr.CostDetailsJson()) + return rsrFld.ParseValue(cdr.CostDetailsJson()) default: - return rsrFld.ParseValue(storedCdr.ExtraFields[rsrFld.Id]) + return rsrFld.ParseValue(cdr.ExtraFields[rsrFld.Id]) } } // Populates the field with id from value; strings are appended to original one -func (storedCdr *StoredCdr) ParseFieldValue(fieldId, fieldVal, timezone string) error { +func (cdr *CDR) ParseFieldValue(fieldId, fieldVal, timezone string) error { var err error switch fieldId { case utils.TOR: - storedCdr.TOR += fieldVal + cdr.TOR += fieldVal case utils.ACCID: - storedCdr.AccId += fieldVal + cdr.OriginID += fieldVal case utils.REQTYPE: - storedCdr.ReqType += fieldVal + cdr.ReqType += fieldVal case utils.DIRECTION: - storedCdr.Direction += fieldVal + cdr.Direction += fieldVal case utils.TENANT: - storedCdr.Tenant += fieldVal + cdr.Tenant += fieldVal case utils.CATEGORY: - storedCdr.Category += fieldVal + cdr.Category += fieldVal case utils.ACCOUNT: - storedCdr.Account += fieldVal + cdr.Account += fieldVal case utils.SUBJECT: - storedCdr.Subject += fieldVal + cdr.Subject += fieldVal case utils.DESTINATION: - storedCdr.Destination += fieldVal + cdr.Destination += fieldVal case utils.RATED_FLD: - storedCdr.Rated, _ = strconv.ParseBool(fieldVal) + cdr.Rated, _ = strconv.ParseBool(fieldVal) case utils.SETUP_TIME: - if storedCdr.SetupTime, err = utils.ParseTimeDetectLayout(fieldVal, timezone); err != nil { + if cdr.SetupTime, err = utils.ParseTimeDetectLayout(fieldVal, timezone); err != nil { return fmt.Errorf("Cannot parse answer time field with value: %s, err: %s", fieldVal, err.Error()) } case utils.PDD: - if storedCdr.Pdd, err = utils.ParseDurationWithSecs(fieldVal); err != nil { + if cdr.PDD, err = utils.ParseDurationWithSecs(fieldVal); err != nil { return fmt.Errorf("Cannot parse answer time field with value: %s, err: %s", fieldVal, err.Error()) } case utils.ANSWER_TIME: - if storedCdr.AnswerTime, err = utils.ParseTimeDetectLayout(fieldVal, timezone); err != nil { + if cdr.AnswerTime, err = utils.ParseTimeDetectLayout(fieldVal, timezone); err != nil { return fmt.Errorf("Cannot parse answer time field with value: %s, err: %s", fieldVal, err.Error()) } case utils.USAGE: - if storedCdr.Usage, err = utils.ParseDurationWithSecs(fieldVal); err != nil { + if cdr.Usage, err = utils.ParseDurationWithSecs(fieldVal); err != nil { return fmt.Errorf("Cannot parse duration field with value: %s, err: %s", fieldVal, err.Error()) } case utils.SUPPLIER: - storedCdr.Supplier += fieldVal + cdr.Supplier += fieldVal case utils.DISCONNECT_CAUSE: - storedCdr.DisconnectCause += fieldVal + cdr.DisconnectCause += fieldVal case utils.COST: - if storedCdr.Cost, err = strconv.ParseFloat(fieldVal, 64); err != nil { + if cdr.Cost, err = strconv.ParseFloat(fieldVal, 64); err != nil { return fmt.Errorf("Cannot parse cost field with value: %s, err: %s", fieldVal, err.Error()) } default: // Extra fields will not match predefined so they all show up here - storedCdr.ExtraFields[fieldId] += fieldVal + cdr.ExtraFields[fieldId] += fieldVal } return nil } // concatenates values of multiple fields defined in template, used eg in CDR templates -func (storedCdr *StoredCdr) FieldsAsString(rsrFlds utils.RSRFields) string { +func (cdr *CDR) FieldsAsString(rsrFlds utils.RSRFields) string { var fldVal string for _, rsrFld := range rsrFlds { - fldVal += storedCdr.FieldAsString(rsrFld) + fldVal += cdr.FieldAsString(rsrFld) } return fldVal } -func (storedCdr *StoredCdr) PassesFieldFilter(fieldFilter *utils.RSRField) (bool, string) { +func (cdr *CDR) PassesFieldFilter(fieldFilter *utils.RSRField) (bool, string) { if fieldFilter == nil { return true, "" } - if fieldFilter.IsStatic() && storedCdr.FieldAsString(&utils.RSRField{Id: fieldFilter.Id}) == storedCdr.FieldAsString(fieldFilter) { - return true, storedCdr.FieldAsString(&utils.RSRField{Id: fieldFilter.Id}) + if fieldFilter.IsStatic() && cdr.FieldAsString(&utils.RSRField{Id: fieldFilter.Id}) == cdr.FieldAsString(fieldFilter) { + return true, cdr.FieldAsString(&utils.RSRField{Id: fieldFilter.Id}) } preparedFilter := &utils.RSRField{Id: fieldFilter.Id, RSRules: make([]*utils.ReSearchReplace, len(fieldFilter.RSRules))} // Reset rules so they do not point towards same structures as original fieldFilter for idx := range fieldFilter.RSRules { // Hardcode the template with maximum of 5 groups ordered preparedFilter.RSRules[idx] = &utils.ReSearchReplace{SearchRegexp: fieldFilter.RSRules[idx].SearchRegexp, ReplaceTemplate: utils.FILTER_REGEXP_TPL} } - preparedVal := storedCdr.FieldAsString(preparedFilter) - filteredValue := storedCdr.FieldAsString(fieldFilter) + preparedVal := cdr.FieldAsString(preparedFilter) + filteredValue := cdr.FieldAsString(fieldFilter) if preparedFilter.RegexpMatched() && (len(preparedVal) == 0 || preparedVal == filteredValue) { return true, filteredValue } return false, "" } -func (storedCdr *StoredCdr) AsStoredCdr(timezone string) *StoredCdr { - return storedCdr +func (cdr *CDR) AsStoredCdr(timezone string) *CDR { + return cdr } -func (storedCdr *StoredCdr) Clone() *StoredCdr { - clnCdr := *storedCdr - clnCdr.ExtraFields = make(map[string]string) - clnCdr.CostDetails = nil // Clean old reference - for k, v := range storedCdr.ExtraFields { - clnCdr.ExtraFields[k] = v - } - if storedCdr.CostDetails != nil { - cDetails := *storedCdr.CostDetails - clnCdr.CostDetails = &cDetails - } - return &clnCdr +func (cdr *CDR) Clone() *CDR { + var clnedCDR CDR + utils.Clone(cdr, &clnedCDR) + return &clnedCDR } // Ability to send the CgrCdr remotely to another CDR server, we do not include rating variables for now -func (storedCdr *StoredCdr) AsHttpForm() url.Values { +func (cdr *CDR) AsHttpForm() url.Values { v := url.Values{} - for fld, val := range storedCdr.ExtraFields { + for fld, val := range cdr.ExtraFields { v.Set(fld, val) } - v.Set(utils.TOR, storedCdr.TOR) - v.Set(utils.ACCID, storedCdr.AccId) - v.Set(utils.CDRHOST, storedCdr.CdrHost) - v.Set(utils.CDRSOURCE, storedCdr.CdrSource) - v.Set(utils.REQTYPE, storedCdr.ReqType) - v.Set(utils.DIRECTION, storedCdr.Direction) - v.Set(utils.TENANT, storedCdr.Tenant) - v.Set(utils.CATEGORY, storedCdr.Category) - v.Set(utils.ACCOUNT, storedCdr.Account) - v.Set(utils.SUBJECT, storedCdr.Subject) - v.Set(utils.DESTINATION, storedCdr.Destination) - v.Set(utils.SETUP_TIME, storedCdr.SetupTime.Format(time.RFC3339)) - v.Set(utils.PDD, storedCdr.FieldAsString(&utils.RSRField{Id: utils.PDD})) - v.Set(utils.ANSWER_TIME, storedCdr.AnswerTime.Format(time.RFC3339)) - v.Set(utils.USAGE, storedCdr.FormatUsage(utils.SECONDS)) - v.Set(utils.SUPPLIER, storedCdr.Supplier) - v.Set(utils.DISCONNECT_CAUSE, storedCdr.DisconnectCause) - if storedCdr.CostDetails != nil { - v.Set(utils.COST_DETAILS, storedCdr.CostDetailsJson()) + v.Set(utils.TOR, cdr.TOR) + v.Set(utils.ACCID, cdr.OriginID) + v.Set(utils.CDRHOST, cdr.OriginHost) + v.Set(utils.CDRSOURCE, cdr.Source) + v.Set(utils.REQTYPE, cdr.ReqType) + v.Set(utils.DIRECTION, cdr.Direction) + v.Set(utils.TENANT, cdr.Tenant) + v.Set(utils.CATEGORY, cdr.Category) + v.Set(utils.ACCOUNT, cdr.Account) + v.Set(utils.SUBJECT, cdr.Subject) + v.Set(utils.DESTINATION, cdr.Destination) + v.Set(utils.SETUP_TIME, cdr.SetupTime.Format(time.RFC3339)) + v.Set(utils.PDD, cdr.FieldAsString(&utils.RSRField{Id: utils.PDD})) + v.Set(utils.ANSWER_TIME, cdr.AnswerTime.Format(time.RFC3339)) + v.Set(utils.USAGE, cdr.FormatUsage(utils.SECONDS)) + v.Set(utils.SUPPLIER, cdr.Supplier) + v.Set(utils.DISCONNECT_CAUSE, cdr.DisconnectCause) + if cdr.CostDetails != nil { + v.Set(utils.COST_DETAILS, cdr.CostDetailsJson()) } return v } // Used in mediation, primaryMandatory marks whether missing field out of request represents error or can be ignored -func (storedCdr *StoredCdr) ForkCdr(runId string, reqTypeFld, directionFld, tenantFld, categFld, accountFld, subjectFld, destFld, setupTimeFld, pddFld, +func (cdr *CDR) ForkCdr(runId string, reqTypeFld, directionFld, tenantFld, categFld, accountFld, subjectFld, destFld, setupTimeFld, PDDFld, answerTimeFld, durationFld, supplierFld, disconnectCauseFld, ratedFld, costFld *utils.RSRField, - extraFlds []*utils.RSRField, primaryMandatory bool, timezone string) (*StoredCdr, error) { + extraFlds []*utils.RSRField, primaryMandatory bool, timezone string) (*CDR, error) { if reqTypeFld == nil { reqTypeFld, _ = utils.NewRSRField(utils.META_DEFAULT) } @@ -396,11 +380,11 @@ func (storedCdr *StoredCdr) ForkCdr(runId string, reqTypeFld, directionFld, tena if durationFld.Id == utils.META_DEFAULT { durationFld.Id = utils.USAGE } - if pddFld == nil { - pddFld, _ = utils.NewRSRField(utils.META_DEFAULT) + if PDDFld == nil { + PDDFld, _ = utils.NewRSRField(utils.META_DEFAULT) } - if pddFld.Id == utils.META_DEFAULT { - pddFld.Id = utils.PDD + if PDDFld.Id == utils.META_DEFAULT { + PDDFld.Id = utils.PDD } if supplierFld == nil { supplierFld, _ = utils.NewRSRField(utils.META_DEFAULT) @@ -427,75 +411,75 @@ func (storedCdr *StoredCdr) ForkCdr(runId string, reqTypeFld, directionFld, tena costFld.Id = utils.COST } var err error - frkStorCdr := new(StoredCdr) - frkStorCdr.CgrId = storedCdr.CgrId - frkStorCdr.TOR = storedCdr.TOR - frkStorCdr.MediationRunId = runId + frkStorCdr := new(CDR) + frkStorCdr.CGRID = cdr.CGRID + frkStorCdr.TOR = cdr.TOR + frkStorCdr.RunID = runId frkStorCdr.Cost = -1.0 // Default for non-rated CDR - frkStorCdr.AccId = storedCdr.AccId - frkStorCdr.CdrHost = storedCdr.CdrHost - frkStorCdr.CdrSource = storedCdr.CdrSource - frkStorCdr.ReqType = storedCdr.FieldAsString(reqTypeFld) + frkStorCdr.OriginID = cdr.OriginID + frkStorCdr.OriginHost = cdr.OriginHost + frkStorCdr.Source = cdr.Source + frkStorCdr.ReqType = cdr.FieldAsString(reqTypeFld) if primaryMandatory && len(frkStorCdr.ReqType) == 0 { return nil, utils.NewErrMandatoryIeMissing(utils.REQTYPE, reqTypeFld.Id) } - frkStorCdr.Direction = storedCdr.FieldAsString(directionFld) + frkStorCdr.Direction = cdr.FieldAsString(directionFld) if primaryMandatory && len(frkStorCdr.Direction) == 0 { return nil, utils.NewErrMandatoryIeMissing(utils.DIRECTION, directionFld.Id) } - frkStorCdr.Tenant = storedCdr.FieldAsString(tenantFld) + frkStorCdr.Tenant = cdr.FieldAsString(tenantFld) if primaryMandatory && len(frkStorCdr.Tenant) == 0 { return nil, utils.NewErrMandatoryIeMissing(utils.TENANT, tenantFld.Id) } - frkStorCdr.Category = storedCdr.FieldAsString(categFld) + frkStorCdr.Category = cdr.FieldAsString(categFld) if primaryMandatory && len(frkStorCdr.Category) == 0 { return nil, utils.NewErrMandatoryIeMissing(utils.CATEGORY, categFld.Id) } - frkStorCdr.Account = storedCdr.FieldAsString(accountFld) + frkStorCdr.Account = cdr.FieldAsString(accountFld) if primaryMandatory && len(frkStorCdr.Account) == 0 { return nil, utils.NewErrMandatoryIeMissing(utils.ACCOUNT, accountFld.Id) } - frkStorCdr.Subject = storedCdr.FieldAsString(subjectFld) + frkStorCdr.Subject = cdr.FieldAsString(subjectFld) if primaryMandatory && len(frkStorCdr.Subject) == 0 { return nil, utils.NewErrMandatoryIeMissing(utils.SUBJECT, subjectFld.Id) } - frkStorCdr.Destination = storedCdr.FieldAsString(destFld) + frkStorCdr.Destination = cdr.FieldAsString(destFld) if primaryMandatory && len(frkStorCdr.Destination) == 0 && frkStorCdr.TOR == utils.VOICE { return nil, utils.NewErrMandatoryIeMissing(utils.DESTINATION, destFld.Id) } - sTimeStr := storedCdr.FieldAsString(setupTimeFld) + sTimeStr := cdr.FieldAsString(setupTimeFld) if primaryMandatory && len(sTimeStr) == 0 { return nil, utils.NewErrMandatoryIeMissing(utils.SETUP_TIME, setupTimeFld.Id) } else if frkStorCdr.SetupTime, err = utils.ParseTimeDetectLayout(sTimeStr, timezone); err != nil { return nil, err } - aTimeStr := storedCdr.FieldAsString(answerTimeFld) + aTimeStr := cdr.FieldAsString(answerTimeFld) if primaryMandatory && len(aTimeStr) == 0 { return nil, utils.NewErrMandatoryIeMissing(utils.ANSWER_TIME, answerTimeFld.Id) } else if frkStorCdr.AnswerTime, err = utils.ParseTimeDetectLayout(aTimeStr, timezone); err != nil { return nil, err } - durStr := storedCdr.FieldAsString(durationFld) + durStr := cdr.FieldAsString(durationFld) if primaryMandatory && len(durStr) == 0 { return nil, utils.NewErrMandatoryIeMissing(utils.USAGE, durationFld.Id) } else if frkStorCdr.Usage, err = utils.ParseDurationWithSecs(durStr); err != nil { return nil, err } - pddStr := storedCdr.FieldAsString(pddFld) - if primaryMandatory && len(pddStr) == 0 { - return nil, utils.NewErrMandatoryIeMissing(utils.PDD, pddFld.Id) - } else if frkStorCdr.Pdd, err = utils.ParseDurationWithSecs(pddStr); err != nil { + PDDStr := cdr.FieldAsString(PDDFld) + if primaryMandatory && len(PDDStr) == 0 { + return nil, utils.NewErrMandatoryIeMissing(utils.PDD, PDDFld.Id) + } else if frkStorCdr.PDD, err = utils.ParseDurationWithSecs(PDDStr); err != nil { return nil, err } - frkStorCdr.Supplier = storedCdr.FieldAsString(supplierFld) - frkStorCdr.DisconnectCause = storedCdr.FieldAsString(disconnectCauseFld) - ratedStr := storedCdr.FieldAsString(ratedFld) + frkStorCdr.Supplier = cdr.FieldAsString(supplierFld) + frkStorCdr.DisconnectCause = cdr.FieldAsString(disconnectCauseFld) + ratedStr := cdr.FieldAsString(ratedFld) if primaryMandatory && len(ratedStr) == 0 { return nil, utils.NewErrMandatoryIeMissing(utils.RATED_FLD, ratedFld.Id) } else if frkStorCdr.Rated, err = strconv.ParseBool(ratedStr); err != nil { return nil, err } - costStr := storedCdr.FieldAsString(costFld) + costStr := cdr.FieldAsString(costFld) if primaryMandatory && len(costStr) == 0 { return nil, utils.NewErrMandatoryIeMissing(utils.COST, costFld.Id) } else if frkStorCdr.Cost, err = strconv.ParseFloat(costStr, 64); err != nil { @@ -503,225 +487,223 @@ func (storedCdr *StoredCdr) ForkCdr(runId string, reqTypeFld, directionFld, tena } frkStorCdr.ExtraFields = make(map[string]string, len(extraFlds)) for _, fld := range extraFlds { - frkStorCdr.ExtraFields[fld.Id] = storedCdr.FieldAsString(fld) + frkStorCdr.ExtraFields[fld.Id] = cdr.FieldAsString(fld) } return frkStorCdr, nil } -func (storedCdr *StoredCdr) AsExternalCdr() *ExternalCdr { - return &ExternalCdr{CgrId: storedCdr.CgrId, - OrderId: storedCdr.OrderId, - TOR: storedCdr.TOR, - AccId: storedCdr.AccId, - CdrHost: storedCdr.CdrHost, - CdrSource: storedCdr.CdrSource, - ReqType: storedCdr.ReqType, - Direction: storedCdr.Direction, - Tenant: storedCdr.Tenant, - Category: storedCdr.Category, - Account: storedCdr.Account, - Subject: storedCdr.Subject, - Destination: storedCdr.Destination, - SetupTime: storedCdr.SetupTime.Format(time.RFC3339), - AnswerTime: storedCdr.AnswerTime.Format(time.RFC3339), - Usage: storedCdr.FormatUsage(utils.SECONDS), - Pdd: storedCdr.FieldAsString(&utils.RSRField{Id: utils.PDD}), - Supplier: storedCdr.Supplier, - DisconnectCause: storedCdr.DisconnectCause, - ExtraFields: storedCdr.ExtraFields, - MediationRunId: storedCdr.MediationRunId, - RatedAccount: storedCdr.RatedAccount, - RatedSubject: storedCdr.RatedSubject, - Cost: storedCdr.Cost, - CostDetails: storedCdr.CostDetailsJson(), +func (cdr *CDR) AsExternalCDR() *ExternalCDR { + return &ExternalCDR{CGRID: cdr.CGRID, + OrderID: cdr.OrderID, + TOR: cdr.TOR, + OriginID: cdr.OriginID, + OriginHost: cdr.OriginHost, + Source: cdr.Source, + ReqType: cdr.ReqType, + Direction: cdr.Direction, + Tenant: cdr.Tenant, + Category: cdr.Category, + Account: cdr.Account, + Subject: cdr.Subject, + Destination: cdr.Destination, + SetupTime: cdr.SetupTime.Format(time.RFC3339), + AnswerTime: cdr.AnswerTime.Format(time.RFC3339), + Usage: cdr.FormatUsage(utils.SECONDS), + PDD: cdr.FieldAsString(&utils.RSRField{Id: utils.PDD}), + Supplier: cdr.Supplier, + DisconnectCause: cdr.DisconnectCause, + ExtraFields: cdr.ExtraFields, + RunID: cdr.RunID, + Cost: cdr.Cost, + CostDetails: cdr.CostDetailsJson(), } } // Implementation of Event interface, used in tests -func (storedCdr *StoredCdr) AsEvent(ignored string) Event { - return Event(storedCdr) +func (cdr *CDR) AsEvent(ignored string) Event { + return Event(cdr) } -func (storedCdr *StoredCdr) ComputeLcr() bool { +func (cdr *CDR) ComputeLcr() bool { return false } -func (storedCdr *StoredCdr) GetName() string { - return storedCdr.CdrSource +func (cdr *CDR) GetName() string { + return cdr.Source } -func (storedCdr *StoredCdr) GetCgrId(timezone string) string { - return storedCdr.CgrId +func (cdr *CDR) GetCgrId(timezone string) string { + return cdr.CGRID } -func (storedCdr *StoredCdr) GetUUID() string { - return storedCdr.AccId +func (cdr *CDR) GetUUID() string { + return cdr.OriginID } -func (storedCdr *StoredCdr) GetSessionIds() []string { - return []string{storedCdr.GetUUID()} +func (cdr *CDR) GetSessionIds() []string { + return []string{cdr.GetUUID()} } -func (storedCdr *StoredCdr) GetDirection(fieldName string) string { +func (cdr *CDR) GetDirection(fieldName string) string { if utils.IsSliceMember([]string{utils.DIRECTION, utils.META_DEFAULT, ""}, fieldName) { - return storedCdr.Direction + return cdr.Direction } if strings.HasPrefix(fieldName, utils.STATIC_VALUE_PREFIX) { // Static value return fieldName[len(utils.STATIC_VALUE_PREFIX):] } - return storedCdr.FieldAsString(&utils.RSRField{Id: fieldName}) + return cdr.FieldAsString(&utils.RSRField{Id: fieldName}) } -func (storedCdr *StoredCdr) GetSubject(fieldName string) string { +func (cdr *CDR) GetSubject(fieldName string) string { if utils.IsSliceMember([]string{utils.SUBJECT, utils.META_DEFAULT, ""}, fieldName) { - return storedCdr.Subject + return cdr.Subject } if strings.HasPrefix(fieldName, utils.STATIC_VALUE_PREFIX) { // Static value return fieldName[len(utils.STATIC_VALUE_PREFIX):] } - return storedCdr.FieldAsString(&utils.RSRField{Id: fieldName}) + return cdr.FieldAsString(&utils.RSRField{Id: fieldName}) } -func (storedCdr *StoredCdr) GetAccount(fieldName string) string { +func (cdr *CDR) GetAccount(fieldName string) string { if utils.IsSliceMember([]string{utils.ACCOUNT, utils.META_DEFAULT, ""}, fieldName) { - return storedCdr.Account + return cdr.Account } if strings.HasPrefix(fieldName, utils.STATIC_VALUE_PREFIX) { // Static value return fieldName[len(utils.STATIC_VALUE_PREFIX):] } - return storedCdr.FieldAsString(&utils.RSRField{Id: fieldName}) + return cdr.FieldAsString(&utils.RSRField{Id: fieldName}) } -func (storedCdr *StoredCdr) GetDestination(fieldName string) string { +func (cdr *CDR) GetDestination(fieldName string) string { if utils.IsSliceMember([]string{utils.DESTINATION, utils.META_DEFAULT, ""}, fieldName) { - return storedCdr.Destination + return cdr.Destination } if strings.HasPrefix(fieldName, utils.STATIC_VALUE_PREFIX) { // Static value return fieldName[len(utils.STATIC_VALUE_PREFIX):] } - return storedCdr.FieldAsString(&utils.RSRField{Id: fieldName}) + return cdr.FieldAsString(&utils.RSRField{Id: fieldName}) } -func (storedCdr *StoredCdr) GetCallDestNr(fieldName string) string { +func (cdr *CDR) GetCallDestNr(fieldName string) string { if utils.IsSliceMember([]string{utils.DESTINATION, utils.META_DEFAULT, ""}, fieldName) { - return storedCdr.Destination + return cdr.Destination } if strings.HasPrefix(fieldName, utils.STATIC_VALUE_PREFIX) { // Static value return fieldName[len(utils.STATIC_VALUE_PREFIX):] } - return storedCdr.FieldAsString(&utils.RSRField{Id: fieldName}) + return cdr.FieldAsString(&utils.RSRField{Id: fieldName}) } -func (storedCdr *StoredCdr) GetCategory(fieldName string) string { +func (cdr *CDR) GetCategory(fieldName string) string { if utils.IsSliceMember([]string{utils.CATEGORY, utils.META_DEFAULT, ""}, fieldName) { - return storedCdr.Category + return cdr.Category } if strings.HasPrefix(fieldName, utils.STATIC_VALUE_PREFIX) { // Static value return fieldName[len(utils.STATIC_VALUE_PREFIX):] } - return storedCdr.FieldAsString(&utils.RSRField{Id: fieldName}) + return cdr.FieldAsString(&utils.RSRField{Id: fieldName}) } -func (storedCdr *StoredCdr) GetTenant(fieldName string) string { +func (cdr *CDR) GetTenant(fieldName string) string { if utils.IsSliceMember([]string{utils.TENANT, utils.META_DEFAULT, ""}, fieldName) { - return storedCdr.Tenant + return cdr.Tenant } if strings.HasPrefix(fieldName, utils.STATIC_VALUE_PREFIX) { // Static value return fieldName[len(utils.STATIC_VALUE_PREFIX):] } - return storedCdr.FieldAsString(&utils.RSRField{Id: fieldName}) + return cdr.FieldAsString(&utils.RSRField{Id: fieldName}) } -func (storedCdr *StoredCdr) GetReqType(fieldName string) string { +func (cdr *CDR) GetReqType(fieldName string) string { if utils.IsSliceMember([]string{utils.REQTYPE, utils.META_DEFAULT, ""}, fieldName) { - return storedCdr.ReqType + return cdr.ReqType } if strings.HasPrefix(fieldName, utils.STATIC_VALUE_PREFIX) { // Static value return fieldName[len(utils.STATIC_VALUE_PREFIX):] } - return storedCdr.FieldAsString(&utils.RSRField{Id: fieldName}) + return cdr.FieldAsString(&utils.RSRField{Id: fieldName}) } -func (storedCdr *StoredCdr) GetSetupTime(fieldName, timezone string) (time.Time, error) { +func (cdr *CDR) GetSetupTime(fieldName, timezone string) (time.Time, error) { if utils.IsSliceMember([]string{utils.SETUP_TIME, utils.META_DEFAULT, ""}, fieldName) { - return storedCdr.SetupTime, nil + return cdr.SetupTime, nil } var sTimeVal string if strings.HasPrefix(fieldName, utils.STATIC_VALUE_PREFIX) { // Static value sTimeVal = fieldName[len(utils.STATIC_VALUE_PREFIX):] } else { - sTimeVal = storedCdr.FieldAsString(&utils.RSRField{Id: fieldName}) + sTimeVal = cdr.FieldAsString(&utils.RSRField{Id: fieldName}) } return utils.ParseTimeDetectLayout(sTimeVal, timezone) } -func (storedCdr *StoredCdr) GetAnswerTime(fieldName, timezone string) (time.Time, error) { +func (cdr *CDR) GetAnswerTime(fieldName, timezone string) (time.Time, error) { if utils.IsSliceMember([]string{utils.ANSWER_TIME, utils.META_DEFAULT, ""}, fieldName) { - return storedCdr.AnswerTime, nil + return cdr.AnswerTime, nil } var aTimeVal string if strings.HasPrefix(fieldName, utils.STATIC_VALUE_PREFIX) { // Static value aTimeVal = fieldName[len(utils.STATIC_VALUE_PREFIX):] } else { - aTimeVal = storedCdr.FieldAsString(&utils.RSRField{Id: fieldName}) + aTimeVal = cdr.FieldAsString(&utils.RSRField{Id: fieldName}) } return utils.ParseTimeDetectLayout(aTimeVal, timezone) } -func (storedCdr *StoredCdr) GetEndTime(fieldName, timezone string) (time.Time, error) { - return storedCdr.AnswerTime.Add(storedCdr.Usage), nil +func (cdr *CDR) GetEndTime(fieldName, timezone string) (time.Time, error) { + return cdr.AnswerTime.Add(cdr.Usage), nil } -func (storedCdr *StoredCdr) GetDuration(fieldName string) (time.Duration, error) { +func (cdr *CDR) GetDuration(fieldName string) (time.Duration, error) { if utils.IsSliceMember([]string{utils.USAGE, utils.META_DEFAULT, ""}, fieldName) { - return storedCdr.Usage, nil + return cdr.Usage, nil } var durVal string if strings.HasPrefix(fieldName, utils.STATIC_VALUE_PREFIX) { // Static value durVal = fieldName[len(utils.STATIC_VALUE_PREFIX):] } else { - durVal = storedCdr.FieldAsString(&utils.RSRField{Id: fieldName}) + durVal = cdr.FieldAsString(&utils.RSRField{Id: fieldName}) } return utils.ParseDurationWithSecs(durVal) } -func (storedCdr *StoredCdr) GetPdd(fieldName string) (time.Duration, error) { +func (cdr *CDR) GetPdd(fieldName string) (time.Duration, error) { if utils.IsSliceMember([]string{utils.PDD, utils.META_DEFAULT, ""}, fieldName) { - return storedCdr.Pdd, nil + return cdr.PDD, nil } - var pddVal string + var PDDVal string if strings.HasPrefix(fieldName, utils.STATIC_VALUE_PREFIX) { // Static value - pddVal = fieldName[len(utils.STATIC_VALUE_PREFIX):] + PDDVal = fieldName[len(utils.STATIC_VALUE_PREFIX):] } else { - pddVal = storedCdr.FieldAsString(&utils.RSRField{Id: fieldName}) + PDDVal = cdr.FieldAsString(&utils.RSRField{Id: fieldName}) } - return utils.ParseDurationWithSecs(pddVal) + return utils.ParseDurationWithSecs(PDDVal) } -func (storedCdr *StoredCdr) GetSupplier(fieldName string) string { +func (cdr *CDR) GetSupplier(fieldName string) string { if utils.IsSliceMember([]string{utils.SUPPLIER, utils.META_DEFAULT, ""}, fieldName) { - return storedCdr.Supplier + return cdr.Supplier } - return storedCdr.FieldAsString(&utils.RSRField{Id: fieldName}) + return cdr.FieldAsString(&utils.RSRField{Id: fieldName}) } -func (storedCdr *StoredCdr) GetDisconnectCause(fieldName string) string { +func (cdr *CDR) GetDisconnectCause(fieldName string) string { if utils.IsSliceMember([]string{utils.DISCONNECT_CAUSE, utils.META_DEFAULT, ""}, fieldName) { - return storedCdr.DisconnectCause + return cdr.DisconnectCause } - return storedCdr.FieldAsString(&utils.RSRField{Id: fieldName}) + return cdr.FieldAsString(&utils.RSRField{Id: fieldName}) } -func (storedCdr *StoredCdr) GetOriginatorIP(fieldName string) string { +func (cdr *CDR) GetOriginatorIP(fieldName string) string { if utils.IsSliceMember([]string{utils.CDRHOST, utils.META_DEFAULT, ""}, fieldName) { - return storedCdr.CdrHost + return cdr.OriginHost } - return storedCdr.FieldAsString(&utils.RSRField{Id: fieldName}) + return cdr.FieldAsString(&utils.RSRField{Id: fieldName}) } -func (storedCdr *StoredCdr) GetExtraFields() map[string]string { - return storedCdr.ExtraFields +func (cdr *CDR) GetExtraFields() map[string]string { + return cdr.ExtraFields } -func (storedCdr *StoredCdr) MissingParameter(timezone string) bool { - return len(storedCdr.AccId) == 0 || - len(storedCdr.Category) == 0 || - len(storedCdr.Tenant) == 0 || - len(storedCdr.Account) == 0 || - len(storedCdr.Destination) == 0 +func (cdr *CDR) MissingParameter(timezone string) bool { + return len(cdr.OriginID) == 0 || + len(cdr.Category) == 0 || + len(cdr.Tenant) == 0 || + len(cdr.Account) == 0 || + len(cdr.Destination) == 0 } -func (storedCdr *StoredCdr) ParseEventValue(rsrFld *utils.RSRField, timezone string) string { - return storedCdr.FieldAsString(rsrFld) +func (cdr *CDR) ParseEventValue(rsrFld *utils.RSRField, timezone string) string { + return cdr.FieldAsString(rsrFld) } -func (storedCdr *StoredCdr) String() string { - mrsh, _ := json.Marshal(storedCdr) +func (cdr *CDR) String() string { + mrsh, _ := json.Marshal(cdr) return string(mrsh) } -type ExternalCdr struct { - CgrId string - OrderId int64 +type ExternalCDR struct { + CGRID string + OrderID int64 TOR string - AccId string - CdrHost string - CdrSource string + OriginID string + OriginHost string + Source string ReqType string Direction string Tenant string @@ -732,13 +714,11 @@ type ExternalCdr struct { SetupTime string AnswerTime string Usage string - Pdd string + PDD string Supplier string DisconnectCause string ExtraFields map[string]string - MediationRunId string - RatedAccount string - RatedSubject string + RunID string Cost float64 CostDetails string Rated bool // Mark the CDR as rated so we do not process it during mediation @@ -760,26 +740,26 @@ type UsageRecord struct { ExtraFields map[string]string } -func (self *UsageRecord) AsStoredCdr(timezone string) (*StoredCdr, error) { +func (self *UsageRecord) AsStoredCdr(timezone string) (*CDR, error) { var err error - storedCdr := &StoredCdr{TOR: self.TOR, ReqType: self.ReqType, Direction: self.Direction, Tenant: self.Tenant, Category: self.Category, + cdr := &CDR{TOR: self.TOR, ReqType: self.ReqType, Direction: self.Direction, Tenant: self.Tenant, Category: self.Category, Account: self.Account, Subject: self.Subject, Destination: self.Destination} - if storedCdr.SetupTime, err = utils.ParseTimeDetectLayout(self.SetupTime, timezone); err != nil { + if cdr.SetupTime, err = utils.ParseTimeDetectLayout(self.SetupTime, timezone); err != nil { return nil, err } - if storedCdr.AnswerTime, err = utils.ParseTimeDetectLayout(self.AnswerTime, timezone); err != nil { + if cdr.AnswerTime, err = utils.ParseTimeDetectLayout(self.AnswerTime, timezone); err != nil { return nil, err } - if storedCdr.Usage, err = utils.ParseDurationWithSecs(self.Usage); err != nil { + if cdr.Usage, err = utils.ParseDurationWithSecs(self.Usage); err != nil { return nil, err } if self.ExtraFields != nil { - storedCdr.ExtraFields = make(map[string]string) + cdr.ExtraFields = make(map[string]string) } for k, v := range self.ExtraFields { - storedCdr.ExtraFields[k] = v + cdr.ExtraFields[k] = v } - return storedCdr, nil + return cdr, nil } func (self *UsageRecord) AsCallDescriptor(timezone string) (*CallDescriptor, error) { diff --git a/engine/storedcdr_local_test.go b/engine/cdr_local_test.go similarity index 77% rename from engine/storedcdr_local_test.go rename to engine/cdr_local_test.go index 78598d20c..7c71fefa9 100644 --- a/engine/storedcdr_local_test.go +++ b/engine/cdr_local_test.go @@ -34,13 +34,13 @@ func TestHttpJsonPost(t *testing.T) { if !*testLocal { return } - cdrOut := &ExternalCdr{CgrId: utils.Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 20, 0, time.UTC).String()), OrderId: 123, TOR: utils.VOICE, AccId: "dsafdsaf", - CdrHost: "192.168.1.1", - CdrSource: utils.UNIT_TEST, ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", + cdrOut := &ExternalCDR{CGRID: utils.Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 20, 0, time.UTC).String()), OrderID: 123, TOR: utils.VOICE, OriginID: "dsafdsaf", + OriginHost: "192.168.1.1", + Source: utils.UNIT_TEST, ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "account1", Subject: "tgooiscs0014", Destination: "1002", SetupTime: time.Date(2013, 11, 7, 8, 42, 20, 0, time.UTC).String(), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String(), - MediationRunId: utils.DEFAULT_RUNID, - Usage: "0.00000001", ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, + RunID: utils.DEFAULT_RUNID, + Usage: "0.00000001", ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, } if _, err := utils.HttpJsonPost("http://localhost:8000", false, cdrOut); err == nil { t.Error(err) diff --git a/engine/storedcdr_test.go b/engine/cdr_test.go similarity index 69% rename from engine/storedcdr_test.go rename to engine/cdr_test.go index 4a58aae1e..764205949 100644 --- a/engine/storedcdr_test.go +++ b/engine/cdr_test.go @@ -26,38 +26,38 @@ import ( "github.com/cgrates/cgrates/utils" ) -func TestStoredCdrInterfaces(t *testing.T) { - storedCdr := new(StoredCdr) - var _ RawCdr = storedCdr - var _ Event = storedCdr +func TestCDRInterfaces(t *testing.T) { + CDR := new(CDR) + var _ RawCdr = CDR + var _ Event = CDR } -func TestNewStoredCdrFromExternalCdr(t *testing.T) { - extCdr := &ExternalCdr{CgrId: utils.Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 20, 0, time.UTC).String()), OrderId: 123, TOR: utils.VOICE, - AccId: "dsafdsaf", CdrHost: "192.168.1.1", CdrSource: utils.UNIT_TEST, ReqType: utils.META_RATED, Direction: "*out", +func TestNewCDRFromExternalCDR(t *testing.T) { + extCdr := &ExternalCDR{CGRID: utils.Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 20, 0, time.UTC).String()), OrderID: 123, TOR: utils.VOICE, + OriginID: "dsafdsaf", OriginHost: "192.168.1.1", Source: utils.UNIT_TEST, ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002", Supplier: "SUPPL1", - SetupTime: "2013-11-07T08:42:20Z", AnswerTime: "2013-11-07T08:42:26Z", MediationRunId: utils.DEFAULT_RUNID, - Usage: "0.00000001", Pdd: "7.0", ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, RatedAccount: "dan", RatedSubject: "dans", Rated: true, + SetupTime: "2013-11-07T08:42:20Z", AnswerTime: "2013-11-07T08:42:26Z", RunID: utils.DEFAULT_RUNID, + Usage: "0.00000001", PDD: "7.0", ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, Rated: true, } - eStorCdr := &StoredCdr{CgrId: utils.Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 20, 0, time.UTC).String()), OrderId: 123, TOR: utils.VOICE, - AccId: "dsafdsaf", CdrHost: "192.168.1.1", CdrSource: utils.UNIT_TEST, ReqType: utils.META_RATED, Direction: "*out", + eStorCdr := &CDR{CGRID: utils.Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 20, 0, time.UTC).String()), OrderID: 123, TOR: utils.VOICE, + OriginID: "dsafdsaf", OriginHost: "192.168.1.1", Source: utils.UNIT_TEST, ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002", Supplier: "SUPPL1", - SetupTime: time.Date(2013, 11, 7, 8, 42, 20, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), MediationRunId: utils.DEFAULT_RUNID, - Usage: time.Duration(10), Pdd: time.Duration(7) * time.Second, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, RatedAccount: "dan", RatedSubject: "dans", Rated: true, + SetupTime: time.Date(2013, 11, 7, 8, 42, 20, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), RunID: utils.DEFAULT_RUNID, + Usage: time.Duration(10), PDD: time.Duration(7) * time.Second, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, Rated: true, } - if storedCdr, err := NewStoredCdrFromExternalCdr(extCdr, ""); err != nil { + if CDR, err := NewCDRFromExternalCDR(extCdr, ""); err != nil { t.Error(err) - } else if !reflect.DeepEqual(eStorCdr, storedCdr) { - t.Errorf("Expected: %+v, received: %+v", eStorCdr, storedCdr) + } else if !reflect.DeepEqual(eStorCdr, CDR) { + t.Errorf("Expected: %+v, received: %+v", eStorCdr, CDR) } } -func TestStoredCdrClone(t *testing.T) { - storCdr := &StoredCdr{CgrId: utils.Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 20, 0, time.UTC).String()), OrderId: 123, TOR: utils.VOICE, - AccId: "dsafdsaf", CdrHost: "192.168.1.1", CdrSource: utils.UNIT_TEST, ReqType: utils.META_RATED, Direction: "*out", +func TestCDRClone(t *testing.T) { + storCdr := &CDR{CGRID: utils.Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 20, 0, time.UTC).String()), OrderID: 123, TOR: utils.VOICE, + OriginID: "dsafdsaf", OriginHost: "192.168.1.1", Source: utils.UNIT_TEST, ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002", Supplier: "SUPPL1", - SetupTime: time.Date(2013, 11, 7, 8, 42, 20, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), MediationRunId: utils.DEFAULT_RUNID, - Usage: time.Duration(10), Pdd: time.Duration(7) * time.Second, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, RatedAccount: "dan", RatedSubject: "dans", Rated: true, + SetupTime: time.Date(2013, 11, 7, 8, 42, 20, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), RunID: utils.DEFAULT_RUNID, + Usage: time.Duration(10), PDD: time.Duration(7) * time.Second, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, Rated: true, } if clnStorCdr := storCdr.Clone(); !reflect.DeepEqual(storCdr, clnStorCdr) { t.Errorf("Expecting: %+v, received: %+v", storCdr, clnStorCdr) @@ -65,19 +65,20 @@ func TestStoredCdrClone(t *testing.T) { } func TestFieldAsString(t *testing.T) { - cdr := StoredCdr{CgrId: utils.Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderId: 123, TOR: utils.VOICE, AccId: "dsafdsaf", - CdrHost: "192.168.1.1", CdrSource: "test", ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", + cdr := CDR{CGRID: utils.Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderID: 123, TOR: utils.VOICE, OriginID: "dsafdsaf", + OriginHost: "192.168.1.1", Source: "test", ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002", SetupTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), - AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), MediationRunId: utils.DEFAULT_RUNID, - Usage: time.Duration(10) * time.Second, Pdd: time.Duration(5) * time.Second, Supplier: "SUPPL1", ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, - Cost: 1.01, RatedAccount: "dan", RatedSubject: "dans", + AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), RunID: utils.DEFAULT_RUNID, + Usage: time.Duration(10) * time.Second, PDD: time.Duration(5) * time.Second, Supplier: "SUPPL1", + ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, + Cost: 1.01, } - if cdr.FieldAsString(&utils.RSRField{Id: utils.CGRID}) != cdr.CgrId || + if cdr.FieldAsString(&utils.RSRField{Id: utils.CGRID}) != cdr.CGRID || cdr.FieldAsString(&utils.RSRField{Id: utils.ORDERID}) != "123" || cdr.FieldAsString(&utils.RSRField{Id: utils.TOR}) != utils.VOICE || - cdr.FieldAsString(&utils.RSRField{Id: utils.ACCID}) != cdr.AccId || - cdr.FieldAsString(&utils.RSRField{Id: utils.CDRHOST}) != cdr.CdrHost || - cdr.FieldAsString(&utils.RSRField{Id: utils.CDRSOURCE}) != cdr.CdrSource || + cdr.FieldAsString(&utils.RSRField{Id: utils.ACCID}) != cdr.OriginID || + cdr.FieldAsString(&utils.RSRField{Id: utils.CDRHOST}) != cdr.OriginHost || + cdr.FieldAsString(&utils.RSRField{Id: utils.CDRSOURCE}) != cdr.Source || cdr.FieldAsString(&utils.RSRField{Id: utils.REQTYPE}) != cdr.ReqType || cdr.FieldAsString(&utils.RSRField{Id: utils.DIRECTION}) != cdr.Direction || cdr.FieldAsString(&utils.RSRField{Id: utils.CATEGORY}) != cdr.Category || @@ -89,20 +90,18 @@ func TestFieldAsString(t *testing.T) { cdr.FieldAsString(&utils.RSRField{Id: utils.USAGE}) != "10" || cdr.FieldAsString(&utils.RSRField{Id: utils.PDD}) != "5" || cdr.FieldAsString(&utils.RSRField{Id: utils.SUPPLIER}) != cdr.Supplier || - cdr.FieldAsString(&utils.RSRField{Id: utils.MEDI_RUNID}) != cdr.MediationRunId || + cdr.FieldAsString(&utils.RSRField{Id: utils.MEDI_RUNID}) != cdr.RunID || cdr.FieldAsString(&utils.RSRField{Id: utils.COST}) != "1.01" || - cdr.FieldAsString(&utils.RSRField{Id: utils.RATED_ACCOUNT}) != "dan" || - cdr.FieldAsString(&utils.RSRField{Id: utils.RATED_SUBJECT}) != "dans" || cdr.FieldAsString(&utils.RSRField{Id: "field_extr1"}) != cdr.ExtraFields["field_extr1"] || cdr.FieldAsString(&utils.RSRField{Id: "fieldextr2"}) != cdr.ExtraFields["fieldextr2"] || cdr.FieldAsString(&utils.RSRField{Id: "dummy_field"}) != "" { t.Error("Unexpected filed value received", - cdr.FieldAsString(&utils.RSRField{Id: utils.CGRID}) != cdr.CgrId, + cdr.FieldAsString(&utils.RSRField{Id: utils.CGRID}) != cdr.CGRID, cdr.FieldAsString(&utils.RSRField{Id: utils.ORDERID}) != "123", cdr.FieldAsString(&utils.RSRField{Id: utils.TOR}) != utils.VOICE, - cdr.FieldAsString(&utils.RSRField{Id: utils.ACCID}) != cdr.AccId, - cdr.FieldAsString(&utils.RSRField{Id: utils.CDRHOST}) != cdr.CdrHost, - cdr.FieldAsString(&utils.RSRField{Id: utils.CDRSOURCE}) != cdr.CdrSource, + cdr.FieldAsString(&utils.RSRField{Id: utils.ACCID}) != cdr.OriginID, + cdr.FieldAsString(&utils.RSRField{Id: utils.CDRHOST}) != cdr.OriginHost, + cdr.FieldAsString(&utils.RSRField{Id: utils.CDRSOURCE}) != cdr.Source, cdr.FieldAsString(&utils.RSRField{Id: utils.REQTYPE}) != cdr.ReqType, cdr.FieldAsString(&utils.RSRField{Id: utils.DIRECTION}) != cdr.Direction, cdr.FieldAsString(&utils.RSRField{Id: utils.CATEGORY}) != cdr.Category, @@ -114,9 +113,7 @@ func TestFieldAsString(t *testing.T) { cdr.FieldAsString(&utils.RSRField{Id: utils.USAGE}) != "10", cdr.FieldAsString(&utils.RSRField{Id: utils.PDD}) != "5", cdr.FieldAsString(&utils.RSRField{Id: utils.SUPPLIER}) != cdr.Supplier, - cdr.FieldAsString(&utils.RSRField{Id: utils.MEDI_RUNID}) != cdr.MediationRunId, - cdr.FieldAsString(&utils.RSRField{Id: utils.RATED_ACCOUNT}) != "dan", - cdr.FieldAsString(&utils.RSRField{Id: utils.RATED_SUBJECT}) != "dans", + cdr.FieldAsString(&utils.RSRField{Id: utils.MEDI_RUNID}) != cdr.RunID, cdr.FieldAsString(&utils.RSRField{Id: utils.COST}) != "1.01", cdr.FieldAsString(&utils.RSRField{Id: "field_extr1"}) != cdr.ExtraFields["field_extr1"], cdr.FieldAsString(&utils.RSRField{Id: "fieldextr2"}) != cdr.ExtraFields["fieldextr2"], @@ -125,12 +122,12 @@ func TestFieldAsString(t *testing.T) { } func TestFieldsAsString(t *testing.T) { - cdr := StoredCdr{CgrId: utils.Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderId: 123, TOR: utils.VOICE, AccId: "dsafdsaf", - CdrHost: "192.168.1.1", CdrSource: "test", ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", + cdr := CDR{CGRID: utils.Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderID: 123, TOR: utils.VOICE, OriginID: "dsafdsaf", + OriginHost: "192.168.1.1", Source: "test", ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002", SetupTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), - AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), MediationRunId: utils.DEFAULT_RUNID, - Usage: time.Duration(10) * time.Second, Pdd: time.Duration(5) * time.Second, Supplier: "SUPPL1", ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, - Cost: 1.01, RatedAccount: "dan", RatedSubject: "dans", + AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), RunID: utils.DEFAULT_RUNID, + Usage: time.Duration(10) * time.Second, PDD: time.Duration(5) * time.Second, Supplier: "SUPPL1", + ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, } eVal := "call_from_1001" if val := cdr.FieldsAsString(utils.ParseRSRFieldsMustCompile("Category;^_from_;Account", utils.INFIELD_SEP)); val != eVal { @@ -139,10 +136,10 @@ func TestFieldsAsString(t *testing.T) { } func TestPassesFieldFilter(t *testing.T) { - cdr := &StoredCdr{CgrId: utils.Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderId: 123, TOR: utils.VOICE, AccId: "dsafdsaf", - CdrHost: "192.168.1.1", CdrSource: "test", ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", + cdr := &CDR{CGRID: utils.Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderID: 123, TOR: utils.VOICE, OriginID: "dsafdsaf", + OriginHost: "192.168.1.1", Source: "test", ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002", SetupTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), - AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), MediationRunId: utils.DEFAULT_RUNID, + AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), RunID: utils.DEFAULT_RUNID, Usage: time.Duration(10) * time.Second, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, } if pass, _ := cdr.PassesFieldFilter(nil); !pass { @@ -183,7 +180,7 @@ func TestPassesFieldFilter(t *testing.T) { } func TestPassesFieldFilterDn1(t *testing.T) { - cdr := &StoredCdr{CgrId: utils.Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), Account: "futurem0005", + cdr := &CDR{CGRID: utils.Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), Account: "futurem0005", ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, } acntPrefxFltr, _ := utils.NewRSRField(`~Account:s/^\w+[shmp]\d{4}$//`) @@ -191,13 +188,13 @@ func TestPassesFieldFilterDn1(t *testing.T) { t.Error("Not passing valid filter") } - cdr = &StoredCdr{CgrId: utils.Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), Account: "futurem00005", + cdr = &CDR{CGRID: utils.Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), Account: "futurem00005", ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, } if pass, _ := cdr.PassesFieldFilter(acntPrefxFltr); pass { t.Error("Should not pass filter") } - cdr = &StoredCdr{CgrId: utils.Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), Account: "0402129281", + cdr = &CDR{CGRID: utils.Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), Account: "0402129281", ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, } acntPrefxFltr, _ = utils.NewRSRField(`~Account:s/^0\d{9}$//`) @@ -208,13 +205,13 @@ func TestPassesFieldFilterDn1(t *testing.T) { if pass, _ := cdr.PassesFieldFilter(acntPrefxFltr); pass { t.Error("Should not pass filter") } - cdr = &StoredCdr{CgrId: utils.Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), Account: "04021292812", + cdr = &CDR{CGRID: utils.Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), Account: "04021292812", ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, } if pass, _ := cdr.PassesFieldFilter(acntPrefxFltr); pass { t.Error("Should not pass filter") } - cdr = &StoredCdr{CgrId: utils.Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), Account: "0162447222", + cdr = &CDR{CGRID: utils.Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), Account: "0162447222", ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, } if acntPrefxFltr, err := utils.NewRSRField(`~Account:s/^0\d{9}$//`); err != nil { @@ -234,11 +231,11 @@ func TestPassesFieldFilterDn1(t *testing.T) { } func TestUsageMultiply(t *testing.T) { - cdr := StoredCdr{Usage: time.Duration(10) * time.Second} + cdr := CDR{Usage: time.Duration(10) * time.Second} if cdr.UsageMultiply(1024.0, 0); cdr.Usage != time.Duration(10240)*time.Second { t.Errorf("Unexpected usage after multiply: %v", cdr.Usage.Nanoseconds()) } - cdr = StoredCdr{Usage: time.Duration(10240) * time.Second} // Simulate conversion back, gives out a bit odd result but this can be rounded on export + cdr = CDR{Usage: time.Duration(10240) * time.Second} // Simulate conversion back, gives out a bit odd result but this can be rounded on export expectDuration, _ := time.ParseDuration("10.000005120s") if cdr.UsageMultiply(0.000976563, 0); cdr.Usage != expectDuration { t.Errorf("Unexpected usage after multiply: %v", cdr.Usage.Nanoseconds()) @@ -246,22 +243,22 @@ func TestUsageMultiply(t *testing.T) { } func TestCostMultiply(t *testing.T) { - cdr := StoredCdr{Cost: 1.01} + cdr := CDR{Cost: 1.01} if cdr.CostMultiply(1.19, 4); cdr.Cost != 1.2019 { t.Errorf("Unexpected cost after multiply: %v", cdr.Cost) } - cdr = StoredCdr{Cost: 1.01} + cdr = CDR{Cost: 1.01} if cdr.CostMultiply(1000, 0); cdr.Cost != 1010 { t.Errorf("Unexpected cost after multiply: %v", cdr.Cost) } } func TestFormatCost(t *testing.T) { - cdr := StoredCdr{Cost: 1.01} + cdr := CDR{Cost: 1.01} if cdr.FormatCost(0, 4) != "1.0100" { t.Error("Unexpected format of the cost: ", cdr.FormatCost(0, 4)) } - cdr = StoredCdr{Cost: 1.01001} + cdr = CDR{Cost: 1.01001} if cdr.FormatCost(0, 4) != "1.0100" { t.Error("Unexpected format of the cost: ", cdr.FormatCost(0, 4)) } @@ -277,34 +274,34 @@ func TestFormatCost(t *testing.T) { } func TestFormatUsage(t *testing.T) { - cdr := StoredCdr{Usage: time.Duration(10) * time.Second} + cdr := CDR{Usage: time.Duration(10) * time.Second} if cdr.FormatUsage(utils.SECONDS) != "10" { t.Error("Wrong usage format: ", cdr.FormatUsage(utils.SECONDS)) } if cdr.FormatUsage("default") != "10" { t.Error("Wrong usage format: ", cdr.FormatUsage("default")) } - cdr = StoredCdr{TOR: utils.DATA, Usage: time.Duration(1640113000000000)} + cdr = CDR{TOR: utils.DATA, Usage: time.Duration(1640113000000000)} if cdr.FormatUsage("default") != "1640113" { t.Error("Wrong usage format: ", cdr.FormatUsage("default")) } - cdr = StoredCdr{Usage: time.Duration(2) * time.Millisecond} + cdr = CDR{Usage: time.Duration(2) * time.Millisecond} if cdr.FormatUsage("default") != "0.002" { t.Error("Wrong usage format: ", cdr.FormatUsage("default")) } - cdr = StoredCdr{Usage: time.Duration(1002) * time.Millisecond} + cdr = CDR{Usage: time.Duration(1002) * time.Millisecond} if cdr.FormatUsage("default") != "1.002" { t.Error("Wrong usage format: ", cdr.FormatUsage("default")) } } -func TestStoredCdrAsHttpForm(t *testing.T) { - storCdr := StoredCdr{CgrId: utils.Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderId: 123, TOR: utils.VOICE, AccId: "dsafdsaf", - CdrHost: "192.168.1.1", CdrSource: utils.UNIT_TEST, ReqType: utils.META_RATED, Direction: "*out", +func TestCDRAsHttpForm(t *testing.T) { + storCdr := CDR{CGRID: utils.Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderID: 123, TOR: utils.VOICE, OriginID: "dsafdsaf", + OriginHost: "192.168.1.1", Source: utils.UNIT_TEST, ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002", - SetupTime: time.Date(2013, 11, 7, 8, 42, 20, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), MediationRunId: utils.DEFAULT_RUNID, + SetupTime: time.Date(2013, 11, 7, 8, 42, 20, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), RunID: utils.DEFAULT_RUNID, Usage: time.Duration(10) * time.Second, Supplier: "SUPPL1", - ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, RatedSubject: "dans", Cost: 1.01, + ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, } cdrForm := storCdr.AsHttpForm() if cdrForm.Get(utils.TOR) != utils.VOICE { @@ -360,13 +357,14 @@ func TestStoredCdrAsHttpForm(t *testing.T) { } } -func TestStoredCdrForkCdr(t *testing.T) { - storCdr := StoredCdr{CgrId: utils.Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderId: 123, TOR: utils.VOICE, - AccId: "dsafdsaf", CdrHost: "192.168.1.1", CdrSource: utils.UNIT_TEST, ReqType: utils.META_RATED, Direction: "*out", +func TestCDRForkCdr(t *testing.T) { + storCdr := CDR{CGRID: utils.Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderID: 123, TOR: utils.VOICE, + OriginID: "dsafdsaf", OriginHost: "192.168.1.1", Source: utils.UNIT_TEST, ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002", - SetupTime: time.Date(2013, 11, 7, 8, 42, 20, 0, time.UTC), Pdd: time.Duration(200) * time.Millisecond, AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), MediationRunId: utils.DEFAULT_RUNID, - Usage: time.Duration(10) * time.Second, Supplier: "suppl1", ExtraFields: map[string]string{"field_extr1": "val_extr1", "field_extr2": "valextr2"}, - Cost: 1.01, RatedSubject: "dans"} + SetupTime: time.Date(2013, 11, 7, 8, 42, 20, 0, time.UTC), PDD: time.Duration(200) * time.Millisecond, + AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), RunID: utils.DEFAULT_RUNID, + Usage: time.Duration(10) * time.Second, Supplier: "suppl1", + ExtraFields: map[string]string{"field_extr1": "val_extr1", "field_extr2": "valextr2"}, Cost: 1.01} rtSampleCdrOut, err := storCdr.ForkCdr("sample_run1", &utils.RSRField{Id: utils.REQTYPE}, &utils.RSRField{Id: utils.DIRECTION}, &utils.RSRField{Id: utils.TENANT}, &utils.RSRField{Id: utils.CATEGORY}, &utils.RSRField{Id: utils.ACCOUNT}, &utils.RSRField{Id: utils.SUBJECT}, &utils.RSRField{Id: utils.DESTINATION}, &utils.RSRField{Id: utils.SETUP_TIME}, &utils.RSRField{Id: utils.PDD}, &utils.RSRField{Id: utils.ANSWER_TIME}, &utils.RSRField{Id: utils.USAGE}, @@ -375,21 +373,21 @@ func TestStoredCdrForkCdr(t *testing.T) { if err != nil { t.Error("Unexpected error received", err) } - expctSplRatedCdr := &StoredCdr{CgrId: storCdr.CgrId, TOR: utils.VOICE, AccId: "dsafdsaf", CdrHost: "192.168.1.1", CdrSource: utils.UNIT_TEST, ReqType: utils.META_RATED, + expctSplRatedCdr := &CDR{CGRID: storCdr.CGRID, TOR: utils.VOICE, OriginID: "dsafdsaf", OriginHost: "192.168.1.1", Source: utils.UNIT_TEST, ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002", - SetupTime: time.Date(2013, 11, 7, 8, 42, 20, 0, time.UTC), Pdd: time.Duration(200) * time.Millisecond, AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), + SetupTime: time.Date(2013, 11, 7, 8, 42, 20, 0, time.UTC), PDD: time.Duration(200) * time.Millisecond, AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), Usage: time.Duration(10) * time.Second, Supplier: "suppl1", ExtraFields: map[string]string{"field_extr1": "val_extr1", "field_extr2": "valextr2"}, - MediationRunId: "sample_run1", Rated: false, Cost: 1.01} + RunID: "sample_run1", Rated: false, Cost: 1.01} if !reflect.DeepEqual(expctSplRatedCdr, rtSampleCdrOut) { t.Errorf("Expected: %v, received: %v", expctSplRatedCdr, rtSampleCdrOut) } } -func TestStoredCdrForkCdrStaticVals(t *testing.T) { - storCdr := StoredCdr{CgrId: utils.Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 20, 0, time.UTC).String()), OrderId: 123, TOR: utils.VOICE, AccId: "dsafdsaf", - CdrHost: "192.168.1.1", CdrSource: utils.UNIT_TEST, ReqType: utils.META_RATED, Direction: "*out", +func TestCDRForkCdrStaticVals(t *testing.T) { + storCdr := CDR{CGRID: utils.Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 20, 0, time.UTC).String()), OrderID: 123, TOR: utils.VOICE, OriginID: "dsafdsaf", + OriginHost: "192.168.1.1", Source: utils.UNIT_TEST, ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002", - SetupTime: time.Date(2013, 11, 7, 8, 42, 20, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), MediationRunId: utils.DEFAULT_RUNID, + SetupTime: time.Date(2013, 11, 7, 8, 42, 20, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), RunID: utils.DEFAULT_RUNID, Usage: time.Duration(10) * time.Second, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, } rsrStPostpaid, _ := utils.NewRSRField("^" + utils.META_POSTPAID) @@ -403,20 +401,20 @@ func TestStoredCdrForkCdrStaticVals(t *testing.T) { rsrStDur, _ := utils.NewRSRField("^12s") rsrStSuppl, _ := utils.NewRSRField("^supplier1") rsrStDCause, _ := utils.NewRSRField("^HANGUP_COMPLETE") - rsrPdd, _ := utils.NewRSRField("^3") + rsrPDD, _ := utils.NewRSRField("^3") rsrStRated, _ := utils.NewRSRField("^true") rsrStCost, _ := utils.NewRSRField("^1.2") rtCdrOut2, err := storCdr.ForkCdr("wholesale_run", rsrStPostpaid, rsrStIn, rsrStCgr, rsrStPC, rsrStFA, rsrStFS, &utils.RSRField{Id: utils.DESTINATION}, - rsrStST, rsrPdd, rsrStAT, rsrStDur, rsrStSuppl, rsrStDCause, rsrStRated, rsrStCost, []*utils.RSRField{}, true, "") + rsrStST, rsrPDD, rsrStAT, rsrStDur, rsrStSuppl, rsrStDCause, rsrStRated, rsrStCost, []*utils.RSRField{}, true, "") if err != nil { t.Error("Unexpected error received", err) } - expctRatedCdr2 := &StoredCdr{CgrId: storCdr.CgrId, TOR: utils.VOICE, AccId: "dsafdsaf", CdrHost: "192.168.1.1", CdrSource: utils.UNIT_TEST, ReqType: utils.META_POSTPAID, + expctRatedCdr2 := &CDR{CGRID: storCdr.CGRID, TOR: utils.VOICE, OriginID: "dsafdsaf", OriginHost: "192.168.1.1", Source: utils.UNIT_TEST, ReqType: utils.META_POSTPAID, Direction: "*in", Tenant: "cgrates.com", Category: "premium_call", Account: "first_account", Subject: "first_subject", Destination: "1002", SetupTime: time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC), - AnswerTime: time.Date(2013, 12, 7, 8, 42, 26, 0, time.UTC), Usage: time.Duration(12) * time.Second, Pdd: time.Duration(3) * time.Second, + AnswerTime: time.Date(2013, 12, 7, 8, 42, 26, 0, time.UTC), Usage: time.Duration(12) * time.Second, PDD: time.Duration(3) * time.Second, Supplier: "supplier1", DisconnectCause: "HANGUP_COMPLETE", Rated: true, Cost: 1.2, - ExtraFields: map[string]string{}, MediationRunId: "wholesale_run"} + ExtraFields: map[string]string{}, RunID: "wholesale_run"} if !reflect.DeepEqual(rtCdrOut2, expctRatedCdr2) { t.Errorf("Received: %v, expected: %v", rtCdrOut2, expctRatedCdr2) } @@ -430,19 +428,19 @@ func TestStoredCdrForkCdrStaticVals(t *testing.T) { } } -func TestStoredCdrForkCdrFromMetaDefaults(t *testing.T) { - storCdr := StoredCdr{CgrId: utils.Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 20, 0, time.UTC).String()), OrderId: 123, TOR: utils.VOICE, AccId: "dsafdsaf", - CdrHost: "192.168.1.1", CdrSource: utils.UNIT_TEST, ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", +func TestCDRForkCdrFromMetaDefaults(t *testing.T) { + storCdr := CDR{CGRID: utils.Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 20, 0, time.UTC).String()), OrderID: 123, TOR: utils.VOICE, OriginID: "dsafdsaf", + OriginHost: "192.168.1.1", Source: utils.UNIT_TEST, ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002", - SetupTime: time.Date(2013, 11, 7, 8, 42, 20, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), MediationRunId: utils.DEFAULT_RUNID, - Usage: time.Duration(10) * time.Second, Pdd: time.Duration(4) * time.Second, Supplier: "SUPPL3", + SetupTime: time.Date(2013, 11, 7, 8, 42, 20, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), RunID: utils.DEFAULT_RUNID, + Usage: time.Duration(10) * time.Second, PDD: time.Duration(4) * time.Second, Supplier: "SUPPL3", ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, } - expctCdr := &StoredCdr{CgrId: storCdr.CgrId, TOR: utils.VOICE, AccId: "dsafdsaf", CdrHost: "192.168.1.1", CdrSource: utils.UNIT_TEST, ReqType: utils.META_RATED, + expctCdr := &CDR{CGRID: storCdr.CGRID, TOR: utils.VOICE, OriginID: "dsafdsaf", OriginHost: "192.168.1.1", Source: utils.UNIT_TEST, ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002", SetupTime: time.Date(2013, 11, 7, 8, 42, 20, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), - Usage: time.Duration(10) * time.Second, Pdd: time.Duration(4) * time.Second, Supplier: "SUPPL3", Cost: 1.01, - ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, MediationRunId: "wholesale_run"} + Usage: time.Duration(10) * time.Second, PDD: time.Duration(4) * time.Second, Supplier: "SUPPL3", Cost: 1.01, + ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, RunID: "wholesale_run"} cdrOut, err := storCdr.ForkCdr("wholesale_run", &utils.RSRField{Id: utils.META_DEFAULT}, &utils.RSRField{Id: utils.META_DEFAULT}, &utils.RSRField{Id: utils.META_DEFAULT}, &utils.RSRField{Id: utils.META_DEFAULT}, &utils.RSRField{Id: utils.META_DEFAULT}, &utils.RSRField{Id: utils.META_DEFAULT}, &utils.RSRField{Id: utils.META_DEFAULT}, &utils.RSRField{Id: utils.META_DEFAULT}, &utils.RSRField{Id: utils.META_DEFAULT}, &utils.RSRField{Id: utils.META_DEFAULT}, &utils.RSRField{Id: utils.META_DEFAULT}, @@ -464,32 +462,30 @@ func TestStoredCdrForkCdrFromMetaDefaults(t *testing.T) { } } -func TestStoredCdrAsExternalCdr(t *testing.T) { - storCdr := StoredCdr{CgrId: utils.Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 20, 0, time.UTC).String()), OrderId: 123, TOR: utils.VOICE, - AccId: "dsafdsaf", CdrHost: "192.168.1.1", CdrSource: utils.UNIT_TEST, ReqType: utils.META_RATED, Direction: "*out", +func TestCDRAsExternalCDR(t *testing.T) { + storCdr := CDR{CGRID: utils.Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 20, 0, time.UTC).String()), OrderID: 123, TOR: utils.VOICE, + OriginID: "dsafdsaf", OriginHost: "192.168.1.1", Source: utils.UNIT_TEST, ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002", - SetupTime: time.Date(2013, 11, 7, 8, 42, 20, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), MediationRunId: utils.DEFAULT_RUNID, - Usage: time.Duration(10), Pdd: time.Duration(7) * time.Second, Supplier: "SUPPL1", ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, - Cost: 1.01, RatedAccount: "dan", RatedSubject: "dans", - } - expectOutCdr := &ExternalCdr{CgrId: utils.Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 20, 0, time.UTC).String()), OrderId: 123, TOR: utils.VOICE, - AccId: "dsafdsaf", CdrHost: "192.168.1.1", CdrSource: utils.UNIT_TEST, ReqType: utils.META_RATED, Direction: "*out", + SetupTime: time.Date(2013, 11, 7, 8, 42, 20, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), RunID: utils.DEFAULT_RUNID, + Usage: time.Duration(10), PDD: time.Duration(7) * time.Second, Supplier: "SUPPL1", + ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01} + expectOutCdr := &ExternalCDR{CGRID: utils.Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 20, 0, time.UTC).String()), OrderID: 123, TOR: utils.VOICE, + OriginID: "dsafdsaf", OriginHost: "192.168.1.1", Source: utils.UNIT_TEST, ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002", - SetupTime: "2013-11-07T08:42:20Z", AnswerTime: "2013-11-07T08:42:26Z", MediationRunId: utils.DEFAULT_RUNID, - Usage: "0.00000001", Pdd: "7", Supplier: "SUPPL1", ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, - Cost: 1.01, RatedAccount: "dan", RatedSubject: "dans", - } - if cdrOut := storCdr.AsExternalCdr(); !reflect.DeepEqual(expectOutCdr, cdrOut) { + SetupTime: "2013-11-07T08:42:20Z", AnswerTime: "2013-11-07T08:42:26Z", RunID: utils.DEFAULT_RUNID, + Usage: "0.00000001", PDD: "7", Supplier: "SUPPL1", + ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01} + if cdrOut := storCdr.AsExternalCDR(); !reflect.DeepEqual(expectOutCdr, cdrOut) { t.Errorf("Expected: %+v, received: %+v", expectOutCdr, cdrOut) } } -func TestStoredCdrEventFields(t *testing.T) { - cdr := &StoredCdr{CgrId: utils.Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderId: 123, TOR: utils.VOICE, AccId: "dsafdsaf", - CdrHost: "192.168.1.1", CdrSource: "test", ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "dan", Subject: "dans", +func TestCDREventFields(t *testing.T) { + cdr := &CDR{CGRID: utils.Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderID: 123, TOR: utils.VOICE, OriginID: "dsafdsaf", + OriginHost: "192.168.1.1", Source: "test", ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "dan", Subject: "dans", Destination: "1002", SetupTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 27, 0, time.UTC), - MediationRunId: utils.DEFAULT_RUNID, Usage: time.Duration(10) * time.Second, Supplier: "suppl1", - ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, RatedAccount: "dan", RatedSubject: "dan"} + RunID: utils.DEFAULT_RUNID, Usage: time.Duration(10) * time.Second, Supplier: "suppl1", + ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01} if ev := cdr.AsEvent(""); ev != Event(cdr) { t.Error("Received: ", ev) @@ -542,7 +538,7 @@ func TestStoredCdrEventFields(t *testing.T) { if suppl := cdr.GetSupplier(utils.META_DEFAULT); suppl != cdr.Supplier { t.Error("Received: ", suppl) } - if res := cdr.GetOriginatorIP(utils.META_DEFAULT); res != cdr.CdrHost { + if res := cdr.GetOriginatorIP(utils.META_DEFAULT); res != cdr.OriginHost { t.Error("Received: ", res) } if extraFlds := cdr.GetExtraFields(); !reflect.DeepEqual(cdr.ExtraFields, extraFlds) { @@ -550,18 +546,18 @@ func TestStoredCdrEventFields(t *testing.T) { } } -func TesUsageReqAsStoredCdr(t *testing.T) { +func TesUsageReqAsCDR(t *testing.T) { setupReq := &UsageRecord{TOR: utils.VOICE, ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002", SetupTime: "2013-11-07T08:42:20Z", AnswerTime: "2013-11-07T08:42:26Z", Usage: "0.00000001", } - eStorCdr := &StoredCdr{TOR: utils.VOICE, ReqType: utils.META_RATED, Direction: "*out", + eStorCdr := &CDR{TOR: utils.VOICE, ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002", SetupTime: time.Date(2013, 11, 7, 8, 42, 20, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), Usage: time.Duration(10)} - if storedCdr, err := setupReq.AsStoredCdr(""); err != nil { + if CDR, err := setupReq.AsStoredCdr(""); err != nil { t.Error(err) - } else if !reflect.DeepEqual(eStorCdr, storedCdr) { - t.Errorf("Expected: %+v, received: %+v", eStorCdr, storedCdr) + } else if !reflect.DeepEqual(eStorCdr, CDR) { + t.Errorf("Expected: %+v, received: %+v", eStorCdr, CDR) } } diff --git a/engine/cdrs.go b/engine/cdrs.go index 787c9ccb7..df6f2faf9 100644 --- a/engine/cdrs.go +++ b/engine/cdrs.go @@ -91,17 +91,17 @@ func (self *CdrServer) RegisterHandlersToServer(server *utils.Server) { } // RPC method, used to internally process CDR -func (self *CdrServer) ProcessCdr(cdr *StoredCdr) error { +func (self *CdrServer) ProcessCdr(cdr *CDR) error { return self.processCdr(cdr) } // RPC method, used to process external CDRs -func (self *CdrServer) ProcessExternalCdr(cdr *ExternalCdr) error { - storedCdr, err := NewStoredCdrFromExternalCdr(cdr, self.cgrCfg.DefaultTimezone) +func (self *CdrServer) ProcessExternalCdr(eCDR *ExternalCDR) error { + cdr, err := NewCDRFromExternalCDR(eCDR, self.cgrCfg.DefaultTimezone) if err != nil { return err } - return self.processCdr(storedCdr) + return self.processCdr(cdr) } // RPC method, used to log callcosts to db @@ -123,7 +123,7 @@ func (self *CdrServer) LogCallCost(ccl *CallCostLog) error { } // Called by rate/re-rate API -func (self *CdrServer) RateCdrs(cgrIds, runIds, tors, cdrHosts, cdrSources, reqTypes, directions, tenants, categories, accounts, subjects, destPrefixes, ratedAccounts, ratedSubjects []string, +func (self *CdrServer) RateCDRs(cgrIds, runIds, tors, cdrHosts, cdrSources, reqTypes, directions, tenants, categories, accounts, subjects, destPrefixes, ratedAccounts, ratedSubjects []string, orderIdStart, orderIdEnd int64, timeStart, timeEnd time.Time, rerateErrors, rerateRated, sendToStats bool) error { var costStart, costEnd *float64 if rerateErrors { @@ -134,18 +134,15 @@ func (self *CdrServer) RateCdrs(cgrIds, runIds, tors, cdrHosts, cdrSources, reqT } else if rerateRated { costStart = utils.Float64Pointer(0.0) } - cdrs, _, err := self.cdrDb.GetStoredCdrs(&utils.CdrsFilter{CgrIds: cgrIds, RunIds: runIds, Tors: tors, CdrHosts: cdrHosts, CdrSources: cdrSources, + cdrs, _, err := self.cdrDb.GetCDRs(&utils.CDRsFilter{CGRIDs: cgrIds, RunIDs: runIds, TORs: tors, Sources: cdrSources, ReqTypes: reqTypes, Directions: directions, Tenants: tenants, Categories: categories, Accounts: accounts, - Subjects: subjects, DestPrefixes: destPrefixes, RatedAccounts: ratedAccounts, RatedSubjects: ratedSubjects, - OrderIdStart: orderIdStart, OrderIdEnd: orderIdEnd, AnswerTimeStart: &timeStart, AnswerTimeEnd: &timeEnd, + Subjects: subjects, DestinationPrefixes: destPrefixes, + OrderIDStart: orderIdStart, OrderIDEnd: orderIdEnd, AnswerTimeStart: &timeStart, AnswerTimeEnd: &timeEnd, MinCost: costStart, MaxCost: costEnd}) if err != nil { return err } for _, cdr := range cdrs { - if cdr.MediationRunId == "" { // raw CDRs which were not calculated before - cdr.MediationRunId = utils.META_DEFAULT - } // replace aliases for cases they were loaded after CDR received if err := LoadAlias(&AttrMatchingAlias{ Destination: cdr.Destination, @@ -170,65 +167,65 @@ func (self *CdrServer) RateCdrs(cgrIds, runIds, tors, cdrHosts, cdrSources, reqT } // Returns error if not able to properly store the CDR, mediation is async since we can always recover offline -func (self *CdrServer) processCdr(storedCdr *StoredCdr) (err error) { - if storedCdr.Direction == "" { - storedCdr.Direction = utils.OUT +func (self *CdrServer) processCdr(cdr *CDR) (err error) { + if cdr.Direction == "" { + cdr.Direction = utils.OUT } - if storedCdr.ReqType == "" { - storedCdr.ReqType = self.cgrCfg.DefaultReqType + if cdr.ReqType == "" { + cdr.ReqType = self.cgrCfg.DefaultReqType } - if storedCdr.Tenant == "" { - storedCdr.Tenant = self.cgrCfg.DefaultTenant + if cdr.Tenant == "" { + cdr.Tenant = self.cgrCfg.DefaultTenant } - if storedCdr.Category == "" { - storedCdr.Category = self.cgrCfg.DefaultCategory + if cdr.Category == "" { + cdr.Category = self.cgrCfg.DefaultCategory } - if storedCdr.Subject == "" { // Use account information as rating subject if missing - storedCdr.Subject = storedCdr.Account + if cdr.Subject == "" { // Use account information as rating subject if missing + cdr.Subject = cdr.Account } // replace aliases if err := LoadAlias(&AttrMatchingAlias{ - Destination: storedCdr.Destination, - Direction: storedCdr.Direction, - Tenant: storedCdr.Tenant, - Category: storedCdr.Category, - Account: storedCdr.Account, - Subject: storedCdr.Subject, + Destination: cdr.Destination, + Direction: cdr.Direction, + Tenant: cdr.Tenant, + Category: cdr.Category, + Account: cdr.Account, + Subject: cdr.Subject, Context: utils.ALIAS_CONTEXT_RATING, - }, storedCdr, utils.EXTRA_FIELDS); err != nil && err != utils.ErrNotFound { + }, cdr, utils.EXTRA_FIELDS); err != nil && err != utils.ErrNotFound { return err } // replace user profile fields - if err := LoadUserProfile(storedCdr, utils.EXTRA_FIELDS); err != nil { + if err := LoadUserProfile(cdr, utils.EXTRA_FIELDS); err != nil { return err } if self.cgrCfg.CDRSStoreCdrs { // Store RawCDRs, this we do sync so we can reply with the status - if err := self.cdrDb.SetCdr(storedCdr); err != nil { // Only original CDR stored in primary table, no derived - utils.Logger.Err(fmt.Sprintf(" Storing primary CDR %+v, got error: %s", storedCdr, err.Error())) + if err := self.cdrDb.SetCdr(cdr); err != nil { // Only original CDR stored in primary table, no derived + utils.Logger.Err(fmt.Sprintf(" Storing primary CDR %+v, got error: %s", cdr, err.Error())) return err // Error is propagated back and we don't continue processing the CDR if we cannot store it } } - go self.deriveRateStoreStatsReplicate(storedCdr) + go self.deriveRateStoreStatsReplicate(cdr) return nil } // Returns error if not able to properly store the CDR, mediation is async since we can always recover offline -func (self *CdrServer) deriveRateStoreStatsReplicate(storedCdr *StoredCdr) error { - cdrRuns, err := self.deriveCdrs(storedCdr) +func (self *CdrServer) deriveRateStoreStatsReplicate(cdr *CDR) error { + cdrRuns, err := self.deriveCdrs(cdr) if err != nil { return err } - for _, cdr := range cdrRuns { - if err := self.rateStoreStatsReplicate(cdr); err != nil { + for _, cdrRun := range cdrRuns { + if err := self.rateStoreStatsReplicate(cdrRun); err != nil { return err } } return nil } -func (self *CdrServer) rateStoreStatsReplicate(cdr *StoredCdr) error { - if cdr.MediationRunId != utils.META_DEFAULT { // Process Aliases and Users for derived CDRs +func (self *CdrServer) rateStoreStatsReplicate(cdr *CDR) error { + if cdr.RunID != utils.META_DEFAULT { // Process Aliases and Users for derived CDRs if err := LoadAlias(&AttrMatchingAlias{ Destination: cdr.Destination, Direction: cdr.Direction, @@ -251,7 +248,7 @@ func (self *CdrServer) rateStoreStatsReplicate(cdr *StoredCdr) error { cdr.ExtraInfo = err.Error() } } - if cdr.MediationRunId == utils.META_SURETAX { // Request should be processed by SureTax + if cdr.RunID == utils.META_SURETAX { // Request should be processed by SureTax if err := SureTaxProcessCdr(cdr); err != nil { cdr.Cost = -1.0 cdr.ExtraInfo = err.Error() // Something failed, write the error in the ExtraInfo @@ -264,7 +261,7 @@ func (self *CdrServer) rateStoreStatsReplicate(cdr *StoredCdr) error { } // Store CostDetails if cdr.Rated || utils.IsSliceMember([]string{utils.RATED, utils.META_RATED}, cdr.ReqType) { // Account related CDRs are saved automatically, so save the others here if requested - if err := self.cdrDb.LogCallCost(cdr.CgrId, utils.CDRS_SOURCE, cdr.MediationRunId, cdr.CostDetails); err != nil { + if err := self.cdrDb.LogCallCost(cdr.CGRID, utils.CDRS_SOURCE, cdr.RunID, cdr.CostDetails); err != nil { utils.Logger.Err(fmt.Sprintf(" Storing costs for CDR %+v, costDetails: %+v, got error: %s", cdr, cdr.CostDetails, err.Error())) } } @@ -272,7 +269,7 @@ func (self *CdrServer) rateStoreStatsReplicate(cdr *StoredCdr) error { // Attach CDR to stats if self.stats != nil { // Send CDR to stats if err := self.stats.AppendCDR(cdr, nil); err != nil { - utils.Logger.Err(fmt.Sprintf(" Could not append cdr to stats: %s", err.Error())) + utils.Logger.Err(fmt.Sprintf(" Could not append CDR to stats: %s", err.Error())) } } if len(self.cgrCfg.CDRSCdrReplication) != 0 { @@ -281,32 +278,31 @@ func (self *CdrServer) rateStoreStatsReplicate(cdr *StoredCdr) error { return nil } -func (self *CdrServer) deriveCdrs(storedCdr *StoredCdr) ([]*StoredCdr, error) { - if len(storedCdr.MediationRunId) == 0 { - storedCdr.MediationRunId = utils.META_DEFAULT +func (self *CdrServer) deriveCdrs(cdr *CDR) ([]*CDR, error) { + if len(cdr.RunID) == 0 { + cdr.RunID = utils.META_DEFAULT } - cdrRuns := []*StoredCdr{storedCdr} - if storedCdr.Rated { // Do not derive already rated CDRs since they should be already derived + cdrRuns := []*CDR{cdr} + if cdr.Rated { // Do not derive already rated CDRs since they should be already derived return cdrRuns, nil } - attrsDC := &utils.AttrDerivedChargers{Tenant: storedCdr.Tenant, Category: storedCdr.Category, Direction: storedCdr.Direction, - Account: storedCdr.Account, Subject: storedCdr.Subject, Destination: storedCdr.Destination} + attrsDC := &utils.AttrDerivedChargers{Tenant: cdr.Tenant, Category: cdr.Category, Direction: cdr.Direction, + Account: cdr.Account, Subject: cdr.Subject, Destination: cdr.Destination} var dcs utils.DerivedChargers if err := self.rater.GetDerivedChargers(attrsDC, &dcs); err != nil { - utils.Logger.Err(fmt.Sprintf("Could not get derived charging for cgrid %s, error: %s", storedCdr.CgrId, err.Error())) + utils.Logger.Err(fmt.Sprintf("Could not get derived charging for cgrid %s, error: %s", cdr.CGRID, err.Error())) return nil, err } for _, dc := range dcs.Chargers { runFilters, _ := utils.ParseRSRFields(dc.RunFilters, utils.INFIELD_SEP) matchingAllFilters := true for _, dcRunFilter := range runFilters { - if fltrPass, _ := storedCdr.PassesFieldFilter(dcRunFilter); !fltrPass { + if fltrPass, _ := cdr.PassesFieldFilter(dcRunFilter); !fltrPass { matchingAllFilters = false break } } if !matchingAllFilters { // Do not process the derived charger further if not all filters were matched - continue } dcReqTypeFld, _ := utils.NewRSRField(dc.ReqTypeField) @@ -317,17 +313,17 @@ func (self *CdrServer) deriveCdrs(storedCdr *StoredCdr) ([]*StoredCdr, error) { dcSubjFld, _ := utils.NewRSRField(dc.SubjectField) dcDstFld, _ := utils.NewRSRField(dc.DestinationField) dcSTimeFld, _ := utils.NewRSRField(dc.SetupTimeField) - dcPddFld, _ := utils.NewRSRField(dc.PddField) + dcPddFld, _ := utils.NewRSRField(dc.PDDField) dcATimeFld, _ := utils.NewRSRField(dc.AnswerTimeField) dcDurFld, _ := utils.NewRSRField(dc.UsageField) dcSupplFld, _ := utils.NewRSRField(dc.SupplierField) dcDCauseFld, _ := utils.NewRSRField(dc.DisconnectCauseField) dcRatedFld, _ := utils.NewRSRField(dc.RatedField) dcCostFld, _ := utils.NewRSRField(dc.CostField) - forkedCdr, err := storedCdr.ForkCdr(dc.RunId, dcReqTypeFld, dcDirFld, dcTenantFld, dcCategoryFld, dcAcntFld, dcSubjFld, dcDstFld, + forkedCdr, err := cdr.ForkCdr(dc.RunID, dcReqTypeFld, dcDirFld, dcTenantFld, dcCategoryFld, dcAcntFld, dcSubjFld, dcDstFld, dcSTimeFld, dcPddFld, dcATimeFld, dcDurFld, dcSupplFld, dcDCauseFld, dcRatedFld, dcCostFld, []*utils.RSRField{}, true, self.cgrCfg.DefaultTimezone) if err != nil { - utils.Logger.Err(fmt.Sprintf("Could not fork CGR with cgrid %s, run: %s, error: %s", storedCdr.CgrId, dc.RunId, err.Error())) + utils.Logger.Err(fmt.Sprintf("Could not fork CGR with cgrid %s, run: %s, error: %s", cdr.CGRID, dc.RunID, err.Error())) continue // do not add it to the forked CDR list } if !forkedCdr.Rated { @@ -339,28 +335,28 @@ func (self *CdrServer) deriveCdrs(storedCdr *StoredCdr) ([]*StoredCdr, error) { } // Retrive the cost from engine -func (self *CdrServer) getCostFromRater(storedCdr *StoredCdr) (*CallCost, error) { +func (self *CdrServer) getCostFromRater(cdr *CDR) (*CallCost, error) { cc := new(CallCost) var err error - timeStart := storedCdr.AnswerTime + timeStart := cdr.AnswerTime if timeStart.IsZero() { // Fix for FreeSWITCH unanswered calls - timeStart = storedCdr.SetupTime + timeStart = cdr.SetupTime } cd := &CallDescriptor{ - TOR: storedCdr.TOR, - Direction: storedCdr.Direction, - Tenant: storedCdr.Tenant, - Category: storedCdr.Category, - Subject: storedCdr.Subject, - Account: storedCdr.Account, - Destination: storedCdr.Destination, + TOR: cdr.TOR, + Direction: cdr.Direction, + Tenant: cdr.Tenant, + Category: cdr.Category, + Subject: cdr.Subject, + Account: cdr.Account, + Destination: cdr.Destination, TimeStart: timeStart, - TimeEnd: timeStart.Add(storedCdr.Usage), - DurationIndex: storedCdr.Usage, + TimeEnd: timeStart.Add(cdr.Usage), + DurationIndex: cdr.Usage, } - if utils.IsSliceMember([]string{utils.META_PSEUDOPREPAID, utils.META_POSTPAID, utils.META_PREPAID, utils.PSEUDOPREPAID, utils.POSTPAID, utils.PREPAID}, storedCdr.ReqType) { // Prepaid - Cost can be recalculated in case of missing records from SM + if utils.IsSliceMember([]string{utils.META_PSEUDOPREPAID, utils.META_POSTPAID, utils.META_PREPAID, utils.PSEUDOPREPAID, utils.POSTPAID, utils.PREPAID}, cdr.ReqType) { // Prepaid - Cost can be recalculated in case of missing records from SM if err = self.rater.Debit(cd, cc); err == nil { // Debit has occured, we are forced to write the log, even if CDR store is disabled - self.cdrDb.LogCallCost(storedCdr.CgrId, utils.CDRS_SOURCE, storedCdr.MediationRunId, cc) + self.cdrDb.LogCallCost(cdr.CGRID, utils.CDRS_SOURCE, cdr.RunID, cc) } } else { err = self.rater.GetCost(cd, cc) @@ -371,41 +367,41 @@ func (self *CdrServer) getCostFromRater(storedCdr *StoredCdr) (*CallCost, error) return cc, nil } -func (self *CdrServer) rateCDR(storedCdr *StoredCdr) error { +func (self *CdrServer) rateCDR(cdr *CDR) error { var qryCC *CallCost var err error - if storedCdr.ReqType == utils.META_NONE { + if cdr.ReqType == utils.META_NONE { return nil } - if utils.IsSliceMember([]string{utils.META_PREPAID, utils.PREPAID}, storedCdr.ReqType) && storedCdr.Usage != 0 { // ToDo: Get rid of PREPAID as soon as we don't want to support it backwards + if utils.IsSliceMember([]string{utils.META_PREPAID, utils.PREPAID}, cdr.ReqType) && cdr.Usage != 0 { // ToDo: Get rid of PREPAID as soon as we don't want to support it backwards // Should be previously calculated and stored in DB delay := utils.Fib() for i := 0; i < 4; i++ { - qryCC, err = self.cdrDb.GetCallCostLog(storedCdr.CgrId, utils.SESSION_MANAGER_SOURCE, storedCdr.MediationRunId) + qryCC, err = self.cdrDb.GetCallCostLog(cdr.CGRID, utils.SESSION_MANAGER_SOURCE, cdr.RunID) if err == nil { break } time.Sleep(delay()) } if err != nil && err == gorm.RecordNotFound { //calculate CDR as for pseudoprepaid - utils.Logger.Warning(fmt.Sprintf(" WARNING: Could not find CallCostLog for cgrid: %s, source: %s, runid: %s, will recalculate", storedCdr.CgrId, utils.SESSION_MANAGER_SOURCE, storedCdr.MediationRunId)) - qryCC, err = self.getCostFromRater(storedCdr) + utils.Logger.Warning(fmt.Sprintf(" WARNING: Could not find CallCostLog for cgrid: %s, source: %s, runid: %s, will recalculate", cdr.CGRID, utils.SESSION_MANAGER_SOURCE, cdr.RunID)) + qryCC, err = self.getCostFromRater(cdr) } } else { - qryCC, err = self.getCostFromRater(storedCdr) + qryCC, err = self.getCostFromRater(cdr) } if err != nil { return err } else if qryCC != nil { - storedCdr.Cost = qryCC.Cost - storedCdr.CostDetails = qryCC + cdr.Cost = qryCC.Cost + cdr.CostDetails = qryCC } return nil } // ToDo: Add websocket support -func (self *CdrServer) replicateCdr(cdr *StoredCdr) error { +func (self *CdrServer) replicateCdr(cdr *CDR) error { for _, rplCfg := range self.cgrCfg.CDRSCdrReplication { passesFilters := true for _, cdfFltr := range rplCfg.CdrFilter { diff --git a/engine/cdrs_local_test.go b/engine/cdrs_local_test.go index 7c1e631dd..9e1afe5c6 100644 --- a/engine/cdrs_local_test.go +++ b/engine/cdrs_local_test.go @@ -90,12 +90,12 @@ func TestCdrsHttpCdrReplication(t *testing.T) { if err != nil { t.Fatal("Could not connect to rater: ", err.Error()) } - testCdr1 := &StoredCdr{CgrId: utils.Sha1("httpjsonrpc1", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()), - TOR: utils.VOICE, AccId: "httpjsonrpc1", CdrHost: "192.168.1.1", CdrSource: "UNKNOWN", ReqType: utils.META_PSEUDOPREPAID, + testCdr1 := &CDR{CGRID: utils.Sha1("httpjsonrpc1", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()), + TOR: utils.VOICE, OriginID: "httpjsonrpc1", OriginHost: "192.168.1.1", Source: "UNKNOWN", ReqType: utils.META_PSEUDOPREPAID, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002", SetupTime: time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC), AnswerTime: time.Date(2013, 12, 7, 8, 42, 26, 0, time.UTC), Usage: time.Duration(10) * time.Second, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, - MediationRunId: utils.DEFAULT_RUNID, Cost: 1.201, Rated: true} + RunID: utils.DEFAULT_RUNID, Cost: 1.201, Rated: true} var reply string if err := cdrsMasterRpc.Call("CdrsV2.ProcessCdr", testCdr1, &reply); err != nil { t.Error("Unexpected error: ", err.Error()) @@ -108,8 +108,8 @@ func TestCdrsHttpCdrReplication(t *testing.T) { t.Fatal("Could not connect to rater: ", err.Error()) } // ToDo: Fix cdr_http to be compatible with rest of processCdr methods - var rcvedCdrs []*ExternalCdr - if err := cdrsSlaveRpc.Call("ApierV2.GetCdrs", utils.RpcCdrsFilter{CgrIds: []string{testCdr1.CgrId}, RunIds: []string{utils.META_DEFAULT}}, &rcvedCdrs); err != nil { + var rcvedCdrs []*ExternalCDR + if err := cdrsSlaveRpc.Call("ApierV2.GetCdrs", utils.RPCCDRsFilter{CGRIDs: []string{testCdr1.CGRID}, RunIDs: []string{utils.META_DEFAULT}}, &rcvedCdrs); err != nil { t.Error("Unexpected error: ", err.Error()) } else if len(rcvedCdrs) != 1 { t.Error("Unexpected number of CDRs returned: ", len(rcvedCdrs)) @@ -117,10 +117,10 @@ func TestCdrsHttpCdrReplication(t *testing.T) { rcvSetupTime, _ := utils.ParseTimeDetectLayout(rcvedCdrs[0].SetupTime, "") rcvAnswerTime, _ := utils.ParseTimeDetectLayout(rcvedCdrs[0].AnswerTime, "") //rcvUsage, _ := utils.ParseDurationWithSecs(rcvedCdrs[0].Usage) - if rcvedCdrs[0].CgrId != testCdr1.CgrId || + if rcvedCdrs[0].CGRID != testCdr1.CGRID || rcvedCdrs[0].TOR != testCdr1.TOR || - rcvedCdrs[0].CdrHost != testCdr1.CdrHost || - rcvedCdrs[0].CdrSource != testCdr1.CdrSource || + rcvedCdrs[0].OriginHost != testCdr1.OriginHost || + rcvedCdrs[0].Source != testCdr1.Source || rcvedCdrs[0].ReqType != testCdr1.ReqType || rcvedCdrs[0].Direction != testCdr1.Direction || rcvedCdrs[0].Tenant != testCdr1.Tenant || @@ -131,7 +131,7 @@ func TestCdrsHttpCdrReplication(t *testing.T) { !rcvSetupTime.Equal(testCdr1.SetupTime) || !rcvAnswerTime.Equal(testCdr1.AnswerTime) || //rcvUsage != 10 || - rcvedCdrs[0].MediationRunId != testCdr1.MediationRunId { + rcvedCdrs[0].RunID != testCdr1.RunID { //rcvedCdrs[0].Cost != testCdr1.Cost || //!reflect.DeepEqual(rcvedCdrs[0].ExtraFields, testCdr1.ExtraFields) { t.Errorf("Expected: %+v, received: %+v", testCdr1, rcvedCdrs[0]) diff --git a/engine/cdrstats.go b/engine/cdrstats.go index 6ff1dae4c..851ec31c9 100644 --- a/engine/cdrstats.go +++ b/engine/cdrstats.go @@ -82,7 +82,7 @@ type CdrStats struct { Triggers ActionTriggers } -func (cs *CdrStats) AcceptCdr(cdr *StoredCdr) bool { +func (cs *CdrStats) AcceptCdr(cdr *CDR) bool { if cdr == nil { return false } @@ -97,10 +97,10 @@ func (cs *CdrStats) AcceptCdr(cdr *StoredCdr) bool { if len(cs.TOR) > 0 && !utils.IsSliceMember(cs.TOR, cdr.TOR) { return false } - if len(cs.CdrHost) > 0 && !utils.IsSliceMember(cs.CdrHost, cdr.CdrHost) { + if len(cs.CdrHost) > 0 && !utils.IsSliceMember(cs.CdrHost, cdr.OriginHost) { return false } - if len(cs.CdrSource) > 0 && !utils.IsSliceMember(cs.CdrSource, cdr.CdrSource) { + if len(cs.CdrSource) > 0 && !utils.IsSliceMember(cs.CdrSource, cdr.Source) { return false } if len(cs.ReqType) > 0 && !utils.IsSliceMember(cs.ReqType, cdr.ReqType) { @@ -153,10 +153,10 @@ func (cs *CdrStats) AcceptCdr(cdr *StoredCdr) bool { } } if len(cs.PddInterval) > 0 { - if cdr.Pdd < cs.PddInterval[0] { + if cdr.PDD < cs.PddInterval[0] { return false } - if len(cs.PddInterval) > 1 && cdr.Pdd >= cs.PddInterval[1] { + if len(cs.PddInterval) > 1 && cdr.PDD >= cs.PddInterval[1] { return false } } @@ -166,7 +166,7 @@ func (cs *CdrStats) AcceptCdr(cdr *StoredCdr) bool { if len(cs.DisconnectCause) > 0 && !utils.IsSliceMember(cs.DisconnectCause, cdr.DisconnectCause) { return false } - if len(cs.MediationRunIds) > 0 && !utils.IsSliceMember(cs.MediationRunIds, cdr.MediationRunId) { + if len(cs.MediationRunIds) > 0 && !utils.IsSliceMember(cs.MediationRunIds, cdr.RunID) { return false } if len(cs.CostInterval) > 0 { @@ -177,12 +177,6 @@ func (cs *CdrStats) AcceptCdr(cdr *StoredCdr) bool { return false } } - if len(cs.RatedAccount) > 0 && !utils.IsSliceMember(cs.RatedAccount, cdr.RatedAccount) { - return false - } - if len(cs.RatedSubject) > 0 && !utils.IsSliceMember(cs.RatedSubject, cdr.RatedSubject) { - return false - } return true } diff --git a/engine/cgrcdr.go b/engine/cgrcdr.go index db33e4020..79433a628 100644 --- a/engine/cgrcdr.go +++ b/engine/cgrcdr.go @@ -31,7 +31,7 @@ func NewCgrCdrFromHttpReq(req *http.Request, timezone string) (CgrCdr, error) { } } cgrCdr := make(CgrCdr) - cgrCdr[utils.CDRHOST] = req.RemoteAddr + cgrCdr[utils.CDRSOURCE] = req.RemoteAddr for k, vals := range req.Form { cgrCdr[k] = vals[0] // We only support the first value for now, if more are provided it is considered remote's fault } @@ -40,9 +40,9 @@ func NewCgrCdrFromHttpReq(req *http.Request, timezone string) (CgrCdr, error) { type CgrCdr map[string]string -func (cgrCdr CgrCdr) getCgrId(timezone string) string { - if cgrId, hasIt := cgrCdr[utils.CGRID]; hasIt { - return cgrId +func (cgrCdr CgrCdr) getCGRID(timezone string) string { + if CGRID, hasIt := cgrCdr[utils.CGRID]; hasIt { + return CGRID } setupTime, _ := utils.ParseTimeDetectLayout(cgrCdr[utils.SETUP_TIME], timezone) return utils.Sha1(cgrCdr[utils.ACCID], setupTime.UTC().String()) @@ -58,22 +58,22 @@ func (cgrCdr CgrCdr) getExtraFields() map[string]string { return extraFields } -func (cgrCdr CgrCdr) AsStoredCdr(timezone string) *StoredCdr { - storCdr := new(StoredCdr) - storCdr.CgrId = cgrCdr.getCgrId(timezone) +func (cgrCdr CgrCdr) AsStoredCdr(timezone string) *CDR { + storCdr := new(CDR) + storCdr.CGRID = cgrCdr.getCGRID(timezone) storCdr.TOR = cgrCdr[utils.TOR] - storCdr.AccId = cgrCdr[utils.ACCID] - storCdr.CdrHost = cgrCdr[utils.CDRHOST] - storCdr.CdrSource = cgrCdr[utils.CDRSOURCE] + storCdr.OriginID = cgrCdr[utils.ACCID] + storCdr.OriginHost = cgrCdr[utils.CDRHOST] + storCdr.Source = cgrCdr[utils.CDRSOURCE] storCdr.ReqType = cgrCdr[utils.REQTYPE] - storCdr.Direction = "*out" + storCdr.Direction = utils.OUT storCdr.Tenant = cgrCdr[utils.TENANT] storCdr.Category = cgrCdr[utils.CATEGORY] storCdr.Account = cgrCdr[utils.ACCOUNT] storCdr.Subject = cgrCdr[utils.SUBJECT] storCdr.Destination = cgrCdr[utils.DESTINATION] storCdr.SetupTime, _ = utils.ParseTimeDetectLayout(cgrCdr[utils.SETUP_TIME], timezone) // Not interested to process errors, should do them if necessary in a previous step - storCdr.Pdd, _ = utils.ParseDurationWithSecs(cgrCdr[utils.PDD]) + storCdr.PDD, _ = utils.ParseDurationWithSecs(cgrCdr[utils.PDD]) storCdr.AnswerTime, _ = utils.ParseTimeDetectLayout(cgrCdr[utils.ANSWER_TIME], timezone) storCdr.Usage, _ = utils.ParseDurationWithSecs(cgrCdr[utils.USAGE]) storCdr.Supplier = cgrCdr[utils.SUPPLIER] diff --git a/engine/cgrcdr_test.go b/engine/cgrcdr_test.go index 5aa544ca1..2dff58c20 100644 --- a/engine/cgrcdr_test.go +++ b/engine/cgrcdr_test.go @@ -26,44 +26,44 @@ import ( ) /* -curl --data "accid=asbfdsaf&cdrhost=192.168.1.1&reqtype=rated&direction=*out&tenant=cgrates.org&tor=call&account=1001&subject=1001&destination=1002&time_answer=1383813746&duration=10&field_extr1=val_extr1&fieldextr2=valextr2" http://ipbxdev:2080/cgr +curl --data "OriginID=asbfdsaf&OriginHost=192.168.1.1&reqtype=rated&direction=*out&tenant=cgrates.org&tor=call&account=1001&subject=1001&destination=1002&time_answer=1383813746&duration=10&field_extr1=val_extr1&fieldextr2=valextr2" http://ipbxdev:2080/cgr */ func TestCgrCdrInterfaces(t *testing.T) { var _ RawCdr = make(CgrCdr) } -func TestCgrCdrAsStoredCdr(t *testing.T) { +func TestCgrCdrAsCDR(t *testing.T) { cgrCdr := CgrCdr{utils.TOR: utils.VOICE, utils.ACCID: "dsafdsaf", utils.CDRHOST: "192.168.1.1", utils.CDRSOURCE: "internal_test", utils.REQTYPE: utils.META_RATED, utils.DIRECTION: utils.OUT, utils.TENANT: "cgrates.org", utils.CATEGORY: "call", utils.ACCOUNT: "1001", utils.SUBJECT: "1001", utils.DESTINATION: "1002", utils.SETUP_TIME: "2013-11-07T08:42:20Z", utils.ANSWER_TIME: "2013-11-07T08:42:26Z", utils.USAGE: "10", utils.SUPPLIER: "SUPPL1", "field_extr1": "val_extr1", "fieldextr2": "valextr2"} setupTime, _ := utils.ParseTimeDetectLayout(cgrCdr[utils.SETUP_TIME], "") - expctRtCdr := &StoredCdr{CgrId: utils.Sha1(cgrCdr[utils.ACCID], setupTime.String()), TOR: utils.VOICE, AccId: cgrCdr[utils.ACCID], CdrHost: cgrCdr[utils.CDRHOST], - CdrSource: cgrCdr[utils.CDRSOURCE], + expctRtCdr := &CDR{CGRID: utils.Sha1(cgrCdr[utils.ACCID], setupTime.String()), TOR: utils.VOICE, OriginID: cgrCdr[utils.ACCID], OriginHost: cgrCdr[utils.CDRHOST], + Source: cgrCdr[utils.CDRSOURCE], ReqType: cgrCdr[utils.REQTYPE], Direction: cgrCdr[utils.DIRECTION], Tenant: cgrCdr[utils.TENANT], Category: cgrCdr[utils.CATEGORY], Account: cgrCdr[utils.ACCOUNT], Subject: cgrCdr[utils.SUBJECT], Destination: cgrCdr[utils.DESTINATION], SetupTime: time.Date(2013, 11, 7, 8, 42, 20, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), Usage: time.Duration(10) * time.Second, Supplier: "SUPPL1", ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: -1} - if storedCdr := cgrCdr.AsStoredCdr(""); !reflect.DeepEqual(expctRtCdr, storedCdr) { - t.Errorf("Expecting %v, received: %v", expctRtCdr, storedCdr) + if CDR := cgrCdr.AsStoredCdr(""); !reflect.DeepEqual(expctRtCdr, CDR) { + t.Errorf("Expecting %v, received: %v", expctRtCdr, CDR) } } -// Make sure the replicated CDR matches the expected StoredCdr -func TestReplicatedCgrCdrAsStoredCdr(t *testing.T) { +// Make sure the replicated CDR matches the expected CDR +func TestReplicatedCgrCdrAsCDR(t *testing.T) { cgrCdr := CgrCdr{utils.CGRID: "164b0422fdc6a5117031b427439482c6a4f90e41", utils.TOR: utils.VOICE, utils.ACCID: "dsafdsaf", utils.CDRHOST: "192.168.1.1", utils.CDRSOURCE: "internal_test", utils.REQTYPE: utils.META_RATED, utils.DIRECTION: utils.OUT, utils.TENANT: "cgrates.org", utils.CATEGORY: "call", utils.ACCOUNT: "1001", utils.SUBJECT: "1001", utils.DESTINATION: "1002", utils.SETUP_TIME: "2013-11-07T08:42:20Z", utils.PDD: "0.200", utils.ANSWER_TIME: "2013-11-07T08:42:26Z", utils.USAGE: "10", utils.SUPPLIER: "SUPPL1", utils.DISCONNECT_CAUSE: "NORMAL_CLEARING", utils.COST: "0.12", utils.RATED: "true", "field_extr1": "val_extr1", "fieldextr2": "valextr2"} - expctRtCdr := &StoredCdr{CgrId: cgrCdr[utils.CGRID], + expctRtCdr := &CDR{CGRID: cgrCdr[utils.CGRID], TOR: cgrCdr[utils.TOR], - AccId: cgrCdr[utils.ACCID], - CdrHost: cgrCdr[utils.CDRHOST], - CdrSource: cgrCdr[utils.CDRSOURCE], + OriginID: cgrCdr[utils.ACCID], + OriginHost: cgrCdr[utils.CDRHOST], + Source: cgrCdr[utils.CDRSOURCE], ReqType: cgrCdr[utils.REQTYPE], Direction: cgrCdr[utils.DIRECTION], Tenant: cgrCdr[utils.TENANT], @@ -72,7 +72,7 @@ func TestReplicatedCgrCdrAsStoredCdr(t *testing.T) { Subject: cgrCdr[utils.SUBJECT], Destination: cgrCdr[utils.DESTINATION], SetupTime: time.Date(2013, 11, 7, 8, 42, 20, 0, time.UTC), - Pdd: time.Duration(200) * time.Millisecond, + PDD: time.Duration(200) * time.Millisecond, AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), Usage: time.Duration(10) * time.Second, Supplier: cgrCdr[utils.SUPPLIER], @@ -81,7 +81,7 @@ func TestReplicatedCgrCdrAsStoredCdr(t *testing.T) { Cost: 0.12, Rated: true, } - if storedCdr := cgrCdr.AsStoredCdr(""); !reflect.DeepEqual(expctRtCdr, storedCdr) { - t.Errorf("Expecting %v, received: %v", expctRtCdr, storedCdr) + if CDR := cgrCdr.AsStoredCdr(""); !reflect.DeepEqual(expctRtCdr, CDR) { + t.Errorf("Expecting %v, received: %v", expctRtCdr, CDR) } } diff --git a/engine/event.go b/engine/event.go index e6a9627f7..91803856f 100644 --- a/engine/event.go +++ b/engine/event.go @@ -33,6 +33,7 @@ type Event interface { GetAccount(string) string GetDestination(string) string GetCallDestNr(string) string + GetOriginatorIP(string) string GetCategory(string) string GetTenant(string) string GetReqType(string) string @@ -43,12 +44,11 @@ type Event interface { GetPdd(string) (time.Duration, error) GetSupplier(string) string GetDisconnectCause(string) string - GetOriginatorIP(string) string GetExtraFields() map[string]string MissingParameter(string) bool ParseEventValue(*utils.RSRField, string) string PassesFieldFilter(*utils.RSRField) (bool, string) - AsStoredCdr(timezone string) *StoredCdr + AsStoredCdr(timezone string) *CDR String() string AsEvent(string) Event ComputeLcr() bool diff --git a/engine/fscdr.go b/engine/fscdr.go index b4fb36306..ef38fced6 100644 --- a/engine/fscdr.go +++ b/engine/fscdr.go @@ -70,7 +70,7 @@ type FSCdr struct { body map[string]interface{} // keeps the loaded body for extra field search } -func (fsCdr FSCdr) getCgrId(timezone string) string { +func (fsCdr FSCdr) getCGRID(timezone string) string { setupTime, _ := utils.ParseTimeDetectLayout(fsCdr.vars[FS_SETUP_TIME], timezone) return utils.Sha1(fsCdr.vars[FS_UUID], setupTime.UTC().String()) } @@ -118,13 +118,13 @@ func (fsCdr FSCdr) searchExtraField(field string, body map[string]interface{}) ( return } -func (fsCdr FSCdr) AsStoredCdr(timezone string) *StoredCdr { - storCdr := new(StoredCdr) - storCdr.CgrId = fsCdr.getCgrId(timezone) +func (fsCdr FSCdr) AsStoredCdr(timezone string) *CDR { + storCdr := new(CDR) + storCdr.CGRID = fsCdr.getCGRID(timezone) storCdr.TOR = utils.VOICE - storCdr.AccId = fsCdr.vars[FS_UUID] - storCdr.CdrHost = fsCdr.vars[FS_IP] - storCdr.CdrSource = FS_CDR_SOURCE + storCdr.OriginID = fsCdr.vars[FS_UUID] + storCdr.OriginHost = fsCdr.vars[FS_IP] + storCdr.Source = FS_CDR_SOURCE storCdr.ReqType = utils.FirstNonEmpty(fsCdr.vars[utils.CGR_REQTYPE], fsCdr.cgrCfg.DefaultReqType) storCdr.Direction = utils.OUT storCdr.Tenant = utils.FirstNonEmpty(fsCdr.vars[utils.CGR_TENANT], fsCdr.cgrCfg.DefaultTenant) @@ -134,8 +134,8 @@ func (fsCdr FSCdr) AsStoredCdr(timezone string) *StoredCdr { storCdr.Destination = utils.FirstNonEmpty(fsCdr.vars[utils.CGR_DESTINATION], fsCdr.vars[FS_CALL_DEST_NR], fsCdr.vars[FS_SIP_REQUSER]) storCdr.SetupTime, _ = utils.ParseTimeDetectLayout(fsCdr.vars[FS_SETUP_TIME], timezone) // Not interested to process errors, should do them if necessary in a previous step pddStr := utils.FirstNonEmpty(fsCdr.vars[FS_PROGRESS_MEDIAMSEC], fsCdr.vars[FS_PROGRESSMS]) - pddStr = pddStr + "ms" - storCdr.Pdd, _ = time.ParseDuration(pddStr) + pddStr += "ms" + storCdr.PDD, _ = time.ParseDuration(pddStr) storCdr.AnswerTime, _ = utils.ParseTimeDetectLayout(fsCdr.vars[FS_ANSWER_TIME], timezone) storCdr.Usage, _ = utils.ParseDurationWithSecs(fsCdr.vars[FS_DURATION]) storCdr.Supplier = fsCdr.vars[utils.CGR_SUPPLIER] diff --git a/engine/fscdr_test.go b/engine/fscdr_test.go index 521d7b5f0..b5fe6357e 100644 --- a/engine/fscdr_test.go +++ b/engine/fscdr_test.go @@ -55,12 +55,12 @@ func TestCDRFields(t *testing.T) { } setupTime, _ := utils.ParseTimeDetectLayout("1436280728", "") answerTime, _ := utils.ParseTimeDetectLayout("1436280728", "") - expctStoredCdr := &StoredCdr{CgrId: "164b0422fdc6a5117031b427439482c6a4f90e41", TOR: utils.VOICE, AccId: "e3133bf7-dcde-4daf-9663-9a79ffcef5ad", - CdrHost: "127.0.0.1", CdrSource: "freeswitch_json", Direction: utils.OUT, Category: "call", ReqType: utils.META_PREPAID, Tenant: "cgrates.org", Account: "1001", Subject: "1001", - Destination: "1003", SetupTime: setupTime, Pdd: time.Duration(28) * time.Millisecond, AnswerTime: answerTime, Usage: time.Duration(66) * time.Second, Supplier: "supplier1", + expctCDR := &CDR{CGRID: "164b0422fdc6a5117031b427439482c6a4f90e41", TOR: utils.VOICE, OriginID: "e3133bf7-dcde-4daf-9663-9a79ffcef5ad", + OriginHost: "127.0.0.1", Source: "freeswitch_json", Direction: utils.OUT, Category: "call", ReqType: utils.META_PREPAID, Tenant: "cgrates.org", Account: "1001", Subject: "1001", + Destination: "1003", SetupTime: setupTime, PDD: time.Duration(28) * time.Millisecond, AnswerTime: answerTime, Usage: time.Duration(66) * time.Second, Supplier: "supplier1", DisconnectCause: "NORMAL_CLEARING", ExtraFields: map[string]string{"sip_user_agent": "PJSUA v2.3 Linux-3.2.0.4/x86_64/glibc-2.13"}, Cost: -1} - if storedCdr := fsCdr.AsStoredCdr(""); !reflect.DeepEqual(expctStoredCdr, storedCdr) { - t.Errorf("Expecting: %v, received: %v", expctStoredCdr, storedCdr) + if CDR := fsCdr.AsStoredCdr(""); !reflect.DeepEqual(expctCDR, CDR) { + t.Errorf("Expecting: %v, received: %v", expctCDR, CDR) } } diff --git a/engine/handler_derivedcharging.go b/engine/handler_derivedcharging.go index d5dc087f8..52f48eb03 100644 --- a/engine/handler_derivedcharging.go +++ b/engine/handler_derivedcharging.go @@ -43,14 +43,14 @@ func HandleGetDerivedChargers(ratingStorage RatingStorage, attrs *utils.AttrDeri } func DerivedChargersMatchesDest(dcs *utils.DerivedChargers, dest string) bool { - if len(dcs.DestinationIds) == 0 || dcs.DestinationIds[utils.ANY] { + if len(dcs.DestinationIDs) == 0 || dcs.DestinationIDs[utils.ANY] { return true } // check destination ids for _, p := range utils.SplitPrefix(dest, MIN_PREFIX_MATCH) { if x, err := cache2go.Get(utils.DESTINATION_PREFIX + p); err == nil { destIds := x.(map[interface{}]struct{}) - for value := range dcs.DestinationIds { + for value := range dcs.DestinationIDs { for idId := range destIds { dId := idId.(string) if value == dId { diff --git a/engine/handler_derivedcharging_test.go b/engine/handler_derivedcharging_test.go index 83a4d2e54..8a2c98f54 100644 --- a/engine/handler_derivedcharging_test.go +++ b/engine/handler_derivedcharging_test.go @@ -95,7 +95,7 @@ func TestHandleGetStoredDC(t *testing.T) { func TestHandleDeivedChargersMatchDestRet(t *testing.T) { dcs := &utils.DerivedChargers{ - DestinationIds: utils.NewStringMap("RET"), + DestinationIDs: utils.NewStringMap("RET"), } if !DerivedChargersMatchesDest(dcs, "0723045326") { t.Error("Derived charger failed to match dest") @@ -104,7 +104,7 @@ func TestHandleDeivedChargersMatchDestRet(t *testing.T) { func TestHandleDeivedChargersMatchDestNat(t *testing.T) { dcs := &utils.DerivedChargers{ - DestinationIds: utils.NewStringMap("NAT"), + DestinationIDs: utils.NewStringMap("NAT"), } if !DerivedChargersMatchesDest(dcs, "0723045326") { t.Error("Derived charger failed to match dest") @@ -113,7 +113,7 @@ func TestHandleDeivedChargersMatchDestNat(t *testing.T) { func TestHandleDeivedChargersMatchDestNatRet(t *testing.T) { dcs := &utils.DerivedChargers{ - DestinationIds: utils.NewStringMap("NAT", "RET"), + DestinationIDs: utils.NewStringMap("NAT", "RET"), } if !DerivedChargersMatchesDest(dcs, "0723045326") { t.Error("Derived charger failed to match dest") diff --git a/engine/loader_csv_test.go b/engine/loader_csv_test.go index a7e5baf33..31769d910 100644 --- a/engine/loader_csv_test.go +++ b/engine/loader_csv_test.go @@ -1100,15 +1100,15 @@ func TestLoadDerivedChargers(t *testing.T) { t.Error("Failed to load derivedChargers: ", csvr.derivedChargers) } expCharger1 := &utils.DerivedChargers{ - DestinationIds: utils.StringMap{}, + DestinationIDs: utils.StringMap{}, Chargers: []*utils.DerivedCharger{ - &utils.DerivedCharger{RunId: "extra1", RunFilters: "^filteredHeader1/filterValue1/", ReqTypeField: "^prepaid", DirectionField: utils.META_DEFAULT, + &utils.DerivedCharger{RunID: "extra1", RunFilters: "^filteredHeader1/filterValue1/", ReqTypeField: "^prepaid", DirectionField: utils.META_DEFAULT, TenantField: utils.META_DEFAULT, CategoryField: utils.META_DEFAULT, AccountField: "rif", SubjectField: "rif", DestinationField: utils.META_DEFAULT, - SetupTimeField: utils.META_DEFAULT, PddField: utils.META_DEFAULT, AnswerTimeField: utils.META_DEFAULT, UsageField: utils.META_DEFAULT, + SetupTimeField: utils.META_DEFAULT, PDDField: utils.META_DEFAULT, AnswerTimeField: utils.META_DEFAULT, UsageField: utils.META_DEFAULT, SupplierField: utils.META_DEFAULT, DisconnectCauseField: utils.META_DEFAULT, CostField: utils.META_DEFAULT, RatedField: utils.META_DEFAULT}, - &utils.DerivedCharger{RunId: "extra2", ReqTypeField: utils.META_DEFAULT, DirectionField: utils.META_DEFAULT, TenantField: utils.META_DEFAULT, + &utils.DerivedCharger{RunID: "extra2", ReqTypeField: utils.META_DEFAULT, DirectionField: utils.META_DEFAULT, TenantField: utils.META_DEFAULT, CategoryField: utils.META_DEFAULT, AccountField: "ivo", SubjectField: "ivo", DestinationField: utils.META_DEFAULT, - SetupTimeField: utils.META_DEFAULT, PddField: utils.META_DEFAULT, AnswerTimeField: utils.META_DEFAULT, UsageField: utils.META_DEFAULT, + SetupTimeField: utils.META_DEFAULT, PDDField: utils.META_DEFAULT, AnswerTimeField: utils.META_DEFAULT, UsageField: utils.META_DEFAULT, SupplierField: utils.META_DEFAULT, DisconnectCauseField: utils.META_DEFAULT, CostField: utils.META_DEFAULT, RatedField: utils.META_DEFAULT}, }} keyCharger1 := utils.DerivedChargersKey("*out", "cgrates.org", "call", "dan", "dan") diff --git a/engine/rawcdr.go b/engine/rawcdr.go index 472ecd175..f186c8bc2 100644 --- a/engine/rawcdr.go +++ b/engine/rawcdr.go @@ -20,5 +20,5 @@ package engine // RawCDR is the original CDR received from external sources (eg: FreeSWITCH) type RawCdr interface { - AsStoredCdr(string) *StoredCdr // Convert the inbound Cdr into internally used one, CgrCdr + AsStoredCdr(string) *CDR // Convert the inbound Cdr into internally used one, CgrCdr } diff --git a/engine/responder.go b/engine/responder.go index 1b0cb9d85..14ff61699 100644 --- a/engine/responder.go +++ b/engine/responder.go @@ -267,7 +267,7 @@ func (rs *Responder) GetMaxSessionTime(arg *CallDescriptor, reply *float64) (err } // Returns MaxSessionTime for an event received in SessionManager, considering DerivedCharging for it -func (rs *Responder) GetDerivedMaxSessionTime(ev *StoredCdr, reply *float64) error { +func (rs *Responder) GetDerivedMaxSessionTime(ev *CDR, reply *float64) error { if rs.Bal != nil { return errors.New("unsupported method on the balancer") } @@ -357,7 +357,7 @@ func (rs *Responder) GetDerivedMaxSessionTime(ev *StoredCdr, reply *float64) err } // Used by SM to get all the prepaid CallDescriptors attached to a session -func (rs *Responder) GetSessionRuns(ev *StoredCdr, sRuns *[]*SessionRun) error { +func (rs *Responder) GetSessionRuns(ev *CDR, sRuns *[]*SessionRun) error { if rs.Bal != nil { return errors.New("Unsupported method on the balancer") } @@ -385,7 +385,7 @@ func (rs *Responder) GetSessionRuns(ev *StoredCdr, sRuns *[]*SessionRun) error { Account: ev.GetAccount(utils.META_DEFAULT), Subject: ev.GetSubject(utils.META_DEFAULT)} dcs := &utils.DerivedChargers{} if err := rs.GetDerivedChargers(attrsDC, dcs); err != nil { - rs.getCache().Cache(utils.GET_SESS_RUNS_CACHE_PREFIX+ev.CgrId, &cache2go.CacheItem{ + rs.getCache().Cache(utils.GET_SESS_RUNS_CACHE_PREFIX+ev.CGRID, &cache2go.CacheItem{ Err: err, }) return err @@ -398,7 +398,7 @@ func (rs *Responder) GetSessionRuns(ev *StoredCdr, sRuns *[]*SessionRun) error { } startTime, err := ev.GetAnswerTime(dc.AnswerTimeField, rs.Timezone) if err != nil { - rs.getCache().Cache(utils.GET_SESS_RUNS_CACHE_PREFIX+ev.CgrId, &cache2go.CacheItem{ + rs.getCache().Cache(utils.GET_SESS_RUNS_CACHE_PREFIX+ev.CGRID, &cache2go.CacheItem{ Err: err, }) return errors.New("Error parsing answer event start time") @@ -414,7 +414,7 @@ func (rs *Responder) GetSessionRuns(ev *StoredCdr, sRuns *[]*SessionRun) error { sesRuns = append(sesRuns, &SessionRun{DerivedCharger: dc, CallDescriptor: cd}) } *sRuns = sesRuns - rs.getCache().Cache(utils.GET_SESS_RUNS_CACHE_PREFIX+ev.CgrId, &cache2go.CacheItem{ + rs.getCache().Cache(utils.GET_SESS_RUNS_CACHE_PREFIX+ev.CGRID, &cache2go.CacheItem{ Value: sRuns, }) return nil @@ -432,7 +432,7 @@ func (rs *Responder) GetDerivedChargers(attrs *utils.AttrDerivedChargers, dcs *u return nil } -func (rs *Responder) ProcessCdr(cdr *StoredCdr, reply *string) error { +func (rs *Responder) ProcessCdr(cdr *CDR, reply *string) error { if rs.CdrSrv == nil { return errors.New("CDR_SERVER_NOT_RUNNING") } @@ -666,9 +666,9 @@ type Connector interface { RefundIncrements(*CallDescriptor, *float64) error GetMaxSessionTime(*CallDescriptor, *float64) error GetDerivedChargers(*utils.AttrDerivedChargers, *utils.DerivedChargers) error - GetDerivedMaxSessionTime(*StoredCdr, *float64) error - GetSessionRuns(*StoredCdr, *[]*SessionRun) error - ProcessCdr(*StoredCdr, *string) error + GetDerivedMaxSessionTime(*CDR, *float64) error + GetSessionRuns(*CDR, *[]*SessionRun) error + ProcessCdr(*CDR, *string) error LogCallCost(*CallCostLog, *string) error GetLCR(*AttrGetLcr, *LCRCost) error GetTimeout(int, *time.Duration) error @@ -699,11 +699,11 @@ func (rcc *RPCClientConnector) GetMaxSessionTime(cd *CallDescriptor, resp *float return rcc.Client.Call("Responder.GetMaxSessionTime", cd, resp) } -func (rcc *RPCClientConnector) GetDerivedMaxSessionTime(ev *StoredCdr, reply *float64) error { +func (rcc *RPCClientConnector) GetDerivedMaxSessionTime(ev *CDR, reply *float64) error { return rcc.Client.Call("Responder.GetDerivedMaxSessionTime", ev, reply) } -func (rcc *RPCClientConnector) GetSessionRuns(ev *StoredCdr, sRuns *[]*SessionRun) error { +func (rcc *RPCClientConnector) GetSessionRuns(ev *CDR, sRuns *[]*SessionRun) error { return rcc.Client.Call("Responder.GetSessionRuns", ev, sRuns) } @@ -711,7 +711,7 @@ func (rcc *RPCClientConnector) GetDerivedChargers(attrs *utils.AttrDerivedCharge return rcc.Client.Call("ApierV1.GetDerivedChargers", attrs, dcs) } -func (rcc *RPCClientConnector) ProcessCdr(cdr *StoredCdr, reply *string) error { +func (rcc *RPCClientConnector) ProcessCdr(cdr *CDR, reply *string) error { return rcc.Client.Call("CdrsV1.ProcessCdr", cdr, reply) } @@ -830,7 +830,7 @@ func (cp ConnectorPool) GetMaxSessionTime(cd *CallDescriptor, resp *float64) err return utils.ErrTimedOut } -func (cp ConnectorPool) GetDerivedMaxSessionTime(ev *StoredCdr, reply *float64) error { +func (cp ConnectorPool) GetDerivedMaxSessionTime(ev *CDR, reply *float64) error { for _, con := range cp { c := make(chan error, 1) var r float64 @@ -850,7 +850,7 @@ func (cp ConnectorPool) GetDerivedMaxSessionTime(ev *StoredCdr, reply *float64) return utils.ErrTimedOut } -func (cp ConnectorPool) GetSessionRuns(ev *StoredCdr, sRuns *[]*SessionRun) error { +func (cp ConnectorPool) GetSessionRuns(ev *CDR, sRuns *[]*SessionRun) error { for _, con := range cp { c := make(chan error, 1) sr := make([]*SessionRun, 0) @@ -890,7 +890,7 @@ func (cp ConnectorPool) GetDerivedChargers(attrs *utils.AttrDerivedChargers, dcs return utils.ErrTimedOut } -func (cp ConnectorPool) ProcessCdr(cdr *StoredCdr, reply *string) error { +func (cp ConnectorPool) ProcessCdr(cdr *CDR, reply *string) error { for _, con := range cp { c := make(chan error, 1) var r string diff --git a/engine/responder_test.go b/engine/responder_test.go index 80801bfad..f9e040be0 100644 --- a/engine/responder_test.go +++ b/engine/responder_test.go @@ -35,8 +35,7 @@ func init() { // Test internal abilites of GetDerivedChargers func TestResponderGetDerivedChargers(t *testing.T) { - - cfgedDC := &utils.DerivedChargers{DestinationIds: utils.StringMap{}, Chargers: []*utils.DerivedCharger{&utils.DerivedCharger{RunId: "responder1", ReqTypeField: utils.META_DEFAULT, DirectionField: "test", TenantField: "test", + cfgedDC := &utils.DerivedChargers{DestinationIDs: utils.StringMap{}, Chargers: []*utils.DerivedCharger{&utils.DerivedCharger{RunID: "responder1", ReqTypeField: utils.META_DEFAULT, DirectionField: "test", TenantField: "test", CategoryField: "test", AccountField: "test", SubjectField: "test", DestinationField: "test", SetupTimeField: "test", AnswerTimeField: "test", UsageField: "test"}}} rsponder = &Responder{} attrs := &utils.AttrDerivedChargers{Tenant: "cgrates.org", Category: "call", Direction: "*out", Account: "responder_test", Subject: "responder_test"} @@ -56,11 +55,11 @@ func TestResponderGetDerivedChargers(t *testing.T) { func TestResponderGetDerivedMaxSessionTime(t *testing.T) { testTenant := "vdf" - cdr := &StoredCdr{CgrId: utils.Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderId: 123, TOR: utils.VOICE, AccId: "dsafdsaf", - CdrHost: "192.168.1.1", CdrSource: "test", ReqType: utils.META_RATED, Direction: "*out", Tenant: testTenant, Category: "call", Account: "dan", Subject: "dan", + cdr := &CDR{CGRID: utils.Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderID: 123, TOR: utils.VOICE, OriginID: "dsafdsaf", + OriginHost: "192.168.1.1", Source: "test", ReqType: utils.META_RATED, Direction: "*out", Tenant: testTenant, Category: "call", Account: "dan", Subject: "dan", Destination: "1002", SetupTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), - MediationRunId: utils.DEFAULT_RUNID, Usage: time.Duration(10) * time.Second, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, - Cost: 1.01, RatedAccount: "dan", RatedSubject: "dan"} + RunID: utils.DEFAULT_RUNID, Usage: time.Duration(10) * time.Second, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, + Cost: 1.01} var maxSessionTime float64 if err := rsponder.GetDerivedMaxSessionTime(cdr, &maxSessionTime); err != nil { t.Error(err) @@ -83,11 +82,11 @@ func TestResponderGetDerivedMaxSessionTime(t *testing.T) { } keyCharger1 := utils.ConcatenatedKey("*out", testTenant, "call", "dan", "dan") charger1 := &utils.DerivedChargers{Chargers: []*utils.DerivedCharger{ - &utils.DerivedCharger{RunId: "extra1", ReqTypeField: "^" + utils.META_PREPAID, DirectionField: "*default", TenantField: "*default", CategoryField: "*default", + &utils.DerivedCharger{RunID: "extra1", ReqTypeField: "^" + utils.META_PREPAID, DirectionField: "*default", TenantField: "*default", CategoryField: "*default", AccountField: "^dan", SubjectField: "^dan", DestinationField: "^+49151708707", SetupTimeField: "*default", AnswerTimeField: "*default", UsageField: "*default"}, - &utils.DerivedCharger{RunId: "extra2", ReqTypeField: "*default", DirectionField: "*default", TenantField: "*default", CategoryField: "*default", + &utils.DerivedCharger{RunID: "extra2", ReqTypeField: "*default", DirectionField: "*default", TenantField: "*default", CategoryField: "*default", AccountField: "^ivo", SubjectField: "^ivo", DestinationField: "*default", SetupTimeField: "*default", AnswerTimeField: "*default", UsageField: "*default"}, - &utils.DerivedCharger{RunId: "extra3", ReqTypeField: "^" + utils.META_PSEUDOPREPAID, DirectionField: "*default", TenantField: "*default", CategoryField: "*default", + &utils.DerivedCharger{RunID: "extra3", ReqTypeField: "^" + utils.META_PSEUDOPREPAID, DirectionField: "*default", TenantField: "*default", CategoryField: "*default", AccountField: "^rif", SubjectField: "^rif", DestinationField: "^+49151708707", SetupTimeField: "*default", AnswerTimeField: "*default", UsageField: "*default"}, }} if err := ratingStorage.SetDerivedChargers(keyCharger1, charger1); err != nil { @@ -122,25 +121,26 @@ func TestResponderGetDerivedMaxSessionTime(t *testing.T) { func TestResponderGetSessionRuns(t *testing.T) { testTenant := "vdf" - cdr := &StoredCdr{CgrId: utils.Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderId: 123, TOR: utils.VOICE, AccId: "dsafdsaf", - CdrHost: "192.168.1.1", CdrSource: "test", ReqType: utils.META_PREPAID, Direction: "*out", Tenant: testTenant, Category: "call", Account: "dan2", Subject: "dan2", - Destination: "1002", SetupTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), Pdd: 3 * time.Second, AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), Supplier: "suppl1", - MediationRunId: utils.DEFAULT_RUNID, Usage: time.Duration(10) * time.Second, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, - Cost: 1.01, RatedAccount: "dan", RatedSubject: "dan"} + cdr := &CDR{CGRID: utils.Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderID: 123, TOR: utils.VOICE, OriginID: "dsafdsaf", + OriginHost: "192.168.1.1", Source: "test", ReqType: utils.META_PREPAID, Direction: "*out", Tenant: testTenant, Category: "call", Account: "dan2", Subject: "dan2", + Destination: "1002", SetupTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), PDD: 3 * time.Second, + AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), Supplier: "suppl1", + RunID: utils.DEFAULT_RUNID, Usage: time.Duration(10) * time.Second, + ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01} keyCharger1 := utils.ConcatenatedKey("*out", testTenant, "call", "dan2", "dan2") - dfDC := &utils.DerivedCharger{RunId: utils.DEFAULT_RUNID, ReqTypeField: utils.META_DEFAULT, DirectionField: utils.META_DEFAULT, TenantField: utils.META_DEFAULT, + dfDC := &utils.DerivedCharger{RunID: utils.DEFAULT_RUNID, ReqTypeField: utils.META_DEFAULT, DirectionField: utils.META_DEFAULT, TenantField: utils.META_DEFAULT, CategoryField: utils.META_DEFAULT, AccountField: utils.META_DEFAULT, SubjectField: utils.META_DEFAULT, DestinationField: utils.META_DEFAULT, - SetupTimeField: utils.META_DEFAULT, PddField: utils.META_DEFAULT, AnswerTimeField: utils.META_DEFAULT, UsageField: utils.META_DEFAULT, SupplierField: utils.META_DEFAULT, + SetupTimeField: utils.META_DEFAULT, PDDField: utils.META_DEFAULT, AnswerTimeField: utils.META_DEFAULT, UsageField: utils.META_DEFAULT, SupplierField: utils.META_DEFAULT, DisconnectCauseField: utils.META_DEFAULT, CostField: utils.META_DEFAULT, RatedField: utils.META_DEFAULT} - extra1DC := &utils.DerivedCharger{RunId: "extra1", ReqTypeField: "^" + utils.META_PREPAID, DirectionField: utils.META_DEFAULT, TenantField: utils.META_DEFAULT, + extra1DC := &utils.DerivedCharger{RunID: "extra1", ReqTypeField: "^" + utils.META_PREPAID, DirectionField: utils.META_DEFAULT, TenantField: utils.META_DEFAULT, CategoryField: "^0", AccountField: "^minitsboy", SubjectField: "^rif", DestinationField: "^0256", - SetupTimeField: utils.META_DEFAULT, PddField: utils.META_DEFAULT, AnswerTimeField: utils.META_DEFAULT, UsageField: utils.META_DEFAULT, SupplierField: utils.META_DEFAULT} - extra2DC := &utils.DerivedCharger{RunId: "extra2", ReqTypeField: utils.META_DEFAULT, DirectionField: utils.META_DEFAULT, TenantField: utils.META_DEFAULT, + SetupTimeField: utils.META_DEFAULT, PDDField: utils.META_DEFAULT, AnswerTimeField: utils.META_DEFAULT, UsageField: utils.META_DEFAULT, SupplierField: utils.META_DEFAULT} + extra2DC := &utils.DerivedCharger{RunID: "extra2", ReqTypeField: utils.META_DEFAULT, DirectionField: utils.META_DEFAULT, TenantField: utils.META_DEFAULT, CategoryField: utils.META_DEFAULT, AccountField: "^ivo", SubjectField: "^ivo", DestinationField: utils.META_DEFAULT, SetupTimeField: utils.META_DEFAULT, AnswerTimeField: utils.META_DEFAULT, UsageField: utils.META_DEFAULT, SupplierField: utils.META_DEFAULT} - extra3DC := &utils.DerivedCharger{RunId: "extra3", ReqTypeField: "^" + utils.META_PSEUDOPREPAID, DirectionField: utils.META_DEFAULT, TenantField: utils.META_DEFAULT, + extra3DC := &utils.DerivedCharger{RunID: "extra3", ReqTypeField: "^" + utils.META_PSEUDOPREPAID, DirectionField: utils.META_DEFAULT, TenantField: utils.META_DEFAULT, CategoryField: "^0", AccountField: "^minu", SubjectField: "^rif", DestinationField: "^0256", - SetupTimeField: utils.META_DEFAULT, PddField: utils.META_DEFAULT, AnswerTimeField: utils.META_DEFAULT, UsageField: utils.META_DEFAULT, SupplierField: utils.META_DEFAULT, + SetupTimeField: utils.META_DEFAULT, PDDField: utils.META_DEFAULT, AnswerTimeField: utils.META_DEFAULT, UsageField: utils.META_DEFAULT, SupplierField: utils.META_DEFAULT, DisconnectCauseField: utils.META_DEFAULT} charger1 := &utils.DerivedChargers{Chargers: []*utils.DerivedCharger{extra1DC, extra2DC, extra3DC}} if err := ratingStorage.SetDerivedChargers(keyCharger1, charger1); err != nil { @@ -482,9 +482,9 @@ func TestResponderGetLCR(t *testing.T) { } else if !reflect.DeepEqual(eQTLcr.SupplierCosts, lcrQT.SupplierCosts) { t.Errorf("Expecting: %+v, received: %+v", eQTLcr.SupplierCosts, lcrQT.SupplierCosts) } - cdr := &StoredCdr{Supplier: "rif12", AnswerTime: time.Now(), Usage: 3 * time.Minute, Cost: 1} + cdr := &CDR{Supplier: "rif12", AnswerTime: time.Now(), Usage: 3 * time.Minute, Cost: 1} rsponder.Stats.AppendCDR(cdr, nil) - cdr = &StoredCdr{Supplier: "dan12", AnswerTime: time.Now(), Usage: 5 * time.Minute, Cost: 2} + cdr = &CDR{Supplier: "dan12", AnswerTime: time.Now(), Usage: 5 * time.Minute, Cost: 2} rsponder.Stats.AppendCDR(cdr, nil) eQTLcr = &LCRCost{ Entry: &LCREntry{DestinationId: utils.ANY, RPCategory: "call", Strategy: LCR_STRATEGY_QOS_THRESHOLD, StrategyParams: "35;;;;4m;;;;;;;;;", Weight: 10.0}, diff --git a/engine/stats.go b/engine/stats.go index 4c9599463..4894943d7 100644 --- a/engine/stats.go +++ b/engine/stats.go @@ -32,7 +32,7 @@ type StatsInterface interface { GetQueueIds(int, *[]string) error GetQueue(string, *StatsQueue) error GetQueueTriggers(string, *ActionTriggers) error - AppendCDR(*StoredCdr, *int) error + AppendCDR(*CDR, *int) error AddQueue(*CdrStats, *int) error ReloadQueues([]string, *int) error ResetQueues([]string, *int) error @@ -268,7 +268,7 @@ func (s *Stats) setupQueueSaver(sq *StatsQueue) { } } -func (s *Stats) AppendCDR(cdr *StoredCdr, out *int) error { +func (s *Stats) AppendCDR(cdr *CDR, out *int) error { s.mux.RLock() defer s.mux.RUnlock() for _, sq := range s.queues { @@ -302,7 +302,7 @@ func (ps *ProxyStats) GetValues(sqID string, values *map[string]float64) error { return ps.Client.Call("Stats.GetValues", sqID, values) } -func (ps *ProxyStats) AppendCDR(cdr *StoredCdr, out *int) error { +func (ps *ProxyStats) AppendCDR(cdr *CDR, out *int) error { return ps.Client.Call("Stats.AppendCDR", cdr, out) } diff --git a/engine/stats_queue.go b/engine/stats_queue.go index c9bd1619f..bfc07356d 100644 --- a/engine/stats_queue.go +++ b/engine/stats_queue.go @@ -111,7 +111,7 @@ func (sq *StatsQueue) Load(saved *StatsQueue) { } } -func (sq *StatsQueue) AppendCDR(cdr *StoredCdr) { +func (sq *StatsQueue) AppendCDR(cdr *CDR) { sq.mux.Lock() defer sq.mux.Unlock() if sq.conf.AcceptCdr(cdr) { @@ -162,11 +162,11 @@ func (sq *StatsQueue) removeFromMetrics(cdr *QCdr) { } } -func (sq *StatsQueue) simplifyCdr(cdr *StoredCdr) *QCdr { +func (sq *StatsQueue) simplifyCdr(cdr *CDR) *QCdr { return &QCdr{ SetupTime: cdr.SetupTime, AnswerTime: cdr.AnswerTime, - Pdd: cdr.Pdd, + Pdd: cdr.PDD, Usage: cdr.Usage, Cost: cdr.Cost, Dest: cdr.Destination, diff --git a/engine/stats_test.go b/engine/stats_test.go index 2823fad38..64b62cc5d 100644 --- a/engine/stats_test.go +++ b/engine/stats_test.go @@ -34,7 +34,7 @@ func TestStatsQueueInit(t *testing.T) { func TestStatsValue(t *testing.T) { sq := NewStatsQueue(&CdrStats{Metrics: []string{ASR, ACD, TCD, ACC, TCC}}) - cdr := &StoredCdr{ + cdr := &CDR{ AnswerTime: time.Date(2014, 7, 14, 14, 25, 0, 0, time.UTC), Usage: 10 * time.Second, Cost: 1, @@ -55,22 +55,22 @@ func TestStatsValue(t *testing.T) { } func TestStatsSimplifyCDR(t *testing.T) { - cdr := &StoredCdr{ - TOR: "tor", - AccId: "accid", - CdrHost: "cdrhost", - CdrSource: "cdrsource", - ReqType: "reqtype", - Direction: "direction", - Tenant: "tenant", - Category: "category", - Account: "account", - Subject: "subject", - Destination: "12345678", - SetupTime: time.Date(2014, 7, 3, 13, 43, 0, 0, time.UTC), - Usage: 10 * time.Second, - MediationRunId: "mri", - Cost: 10, + cdr := &CDR{ + TOR: "tor", + OriginID: "accid", + OriginHost: "cdrhost", + Source: "cdrsource", + ReqType: "reqtype", + Direction: "direction", + Tenant: "tenant", + Category: "category", + Account: "account", + Subject: "subject", + Destination: "12345678", + SetupTime: time.Date(2014, 7, 3, 13, 43, 0, 0, time.UTC), + Usage: 10 * time.Second, + RunID: "mri", + Cost: 10, } sq := &StatsQueue{} qcdr := sq.simplifyCdr(cdr) @@ -84,11 +84,11 @@ func TestStatsSimplifyCDR(t *testing.T) { func TestAcceptCdr(t *testing.T) { sq := NewStatsQueue(nil) - cdr := &StoredCdr{ + cdr := &CDR{ TOR: "tor", - AccId: "accid", - CdrHost: "cdrhost", - CdrSource: "cdrsource", + OriginID: "accid", + OriginHost: "cdrhost", + Source: "cdrsource", ReqType: "reqtype", Direction: "direction", Tenant: "tenant", @@ -98,10 +98,10 @@ func TestAcceptCdr(t *testing.T) { Destination: "0723045326", SetupTime: time.Date(2014, 7, 3, 13, 43, 0, 0, time.UTC), Usage: 10 * time.Second, - Pdd: 7 * time.Second, + PDD: 7 * time.Second, Supplier: "supplier1", DisconnectCause: "normal", - MediationRunId: "mri", + RunID: "mri", Cost: 10, } sq.conf = &CdrStats{} @@ -148,14 +148,6 @@ func TestAcceptCdr(t *testing.T) { if sq.conf.AcceptCdr(cdr) == true { t.Errorf("Should have NOT accepted this CDR: %+v", cdr) } - sq.conf = &CdrStats{RatedAccount: []string{"test"}} - if sq.conf.AcceptCdr(cdr) == true { - t.Errorf("Should have NOT accepted this CDR: %+v", cdr) - } - sq.conf = &CdrStats{RatedSubject: []string{"test"}} - if sq.conf.AcceptCdr(cdr) == true { - t.Errorf("Should have NOT accepted this CDR: %+v", cdr) - } sq.conf = &CdrStats{DestinationIds: []string{"test"}} if sq.conf.AcceptCdr(cdr) == true { t.Errorf("Should have NOT accepted this CDR: %+v", cdr) @@ -217,7 +209,7 @@ func TestStatsQueueIds(t *testing.T) { func TestStatsAppendCdr(t *testing.T) { cdrStats := NewStats(ratingStorage, accountingStorage, 0) - cdr := &StoredCdr{ + cdr := &CDR{ Tenant: "cgrates.org", Category: "call", AnswerTime: time.Now(), @@ -241,7 +233,7 @@ func TestStatsAppendCdr(t *testing.T) { func TestStatsGetValues(t *testing.T) { cdrStats := NewStats(ratingStorage, accountingStorage, 0) - cdr := &StoredCdr{ + cdr := &CDR{ Tenant: "cgrates.org", Category: "call", AnswerTime: time.Now(), @@ -250,7 +242,7 @@ func TestStatsGetValues(t *testing.T) { Cost: 10, } cdrStats.AppendCDR(cdr, nil) - cdr = &StoredCdr{ + cdr = &CDR{ Tenant: "cgrates.org", Category: "call", AnswerTime: time.Now(), @@ -270,7 +262,7 @@ func TestStatsGetValues(t *testing.T) { func TestStatsReloadQueues(t *testing.T) { cdrStats := NewStats(ratingStorage, accountingStorage, 0) - cdr := &StoredCdr{ + cdr := &CDR{ Tenant: "cgrates.org", Category: "call", AnswerTime: time.Now(), @@ -305,7 +297,7 @@ func TestStatsReloadQueuesWithDefault(t *testing.T) { cdrStats.AddQueue(&CdrStats{ Id: utils.META_DEFAULT, }, nil) - cdr := &StoredCdr{ + cdr := &CDR{ Tenant: "cgrates.org", Category: "call", AnswerTime: time.Now(), @@ -338,7 +330,7 @@ func TestStatsReloadQueuesWithDefault(t *testing.T) { func TestStatsReloadQueuesWithIds(t *testing.T) { cdrStats := NewStats(ratingStorage, accountingStorage, 0) - cdr := &StoredCdr{ + cdr := &CDR{ Tenant: "cgrates.org", Category: "call", AnswerTime: time.Now(), @@ -370,7 +362,7 @@ func TestStatsReloadQueuesWithIds(t *testing.T) { func TestStatsSaveQueues(t *testing.T) { cdrStats := NewStats(ratingStorage, accountingStorage, 0) - cdr := &StoredCdr{ + cdr := &CDR{ Tenant: "cgrates.org", Category: "call", AnswerTime: time.Now(), @@ -388,7 +380,7 @@ func TestStatsSaveQueues(t *testing.T) { func TestStatsResetQueues(t *testing.T) { cdrStats := NewStats(ratingStorage, accountingStorage, 0) - cdr := &StoredCdr{ + cdr := &CDR{ Tenant: "cgrates.org", Category: "call", AnswerTime: time.Now(), @@ -420,7 +412,7 @@ func TestStatsResetQueues(t *testing.T) { func TestStatsResetQueuesWithIds(t *testing.T) { cdrStats := NewStats(ratingStorage, accountingStorage, 0) - cdr := &StoredCdr{ + cdr := &CDR{ Tenant: "cgrates.org", Category: "call", AnswerTime: time.Now(), diff --git a/engine/storage_interface.go b/engine/storage_interface.go index 8c51db8ea..a2120c438 100644 --- a/engine/storage_interface.go +++ b/engine/storage_interface.go @@ -94,12 +94,12 @@ type AccountingStorage interface { type CdrStorage interface { Storage - SetCdr(*StoredCdr) error - SetRatedCdr(*StoredCdr) error + SetCdr(*CDR) error + SetRatedCdr(*CDR) error LogCallCost(cgrid, source, runid string, cc *CallCost) error GetCallCostLog(cgrid, source, runid string) (*CallCost, error) - GetStoredCdrs(*utils.CdrsFilter) ([]*StoredCdr, int64, error) - RemStoredCdrs([]string) error + GetCDRs(*utils.CDRsFilter) ([]*CDR, int64, error) + RemCDRs([]string) error } type LogStorage interface { diff --git a/engine/storage_mongo_local_test.go b/engine/storage_mongo_local_test.go index 14e5183a4..19dad09dc 100644 --- a/engine/storage_mongo_local_test.go +++ b/engine/storage_mongo_local_test.go @@ -197,11 +197,11 @@ func TestMongoSetGetTPSharedGroups(t *testing.T) { } } -func TestMongoSetGetTPCdrStats(t *testing.T) { +func TestMongoSetGetTPcdrstats(t *testing.T) { if !*testLocal { return } - CS_ID := "CDRSTATS_1" + CS_ID := "cdrsTATS_1" setCS := &utils.TPCdrStats{ TPid: utils.TEST_SQL, CdrStatsId: CS_ID, @@ -459,52 +459,57 @@ func TestMongoSetCdr(t *testing.T) { } cgrCdr1 := &CgrCdr{utils.TOR: utils.VOICE, utils.ACCID: "aaa1", utils.CDRHOST: "192.168.1.1", utils.REQTYPE: utils.META_RATED, utils.DIRECTION: "*out", utils.TENANT: "cgrates.org", utils.CATEGORY: "call", utils.ACCOUNT: "1001", utils.SUBJECT: "1001", utils.DESTINATION: "1002", utils.SETUP_TIME: "2013-11-08T08:42:20Z", - utils.ANSWER_TIME: "2013-11-08T08:42:26Z", utils.USAGE: "10s", utils.PDD: "4s", utils.SUPPLIER: "SUPPL1", "field_extr1": "val_extr1", "fieldextr2": "valextr2", utils.CDRSOURCE: utils.TEST_SQL} + utils.ANSWER_TIME: "2013-11-08T08:42:26Z", utils.USAGE: "10s", utils.PDD: "4s", utils.SUPPLIER: "SUPPL1", + "field_extr1": "val_extr1", "fieldextr2": "valextr2", utils.CDRSOURCE: utils.TEST_SQL} cgrCdr2 := &CgrCdr{utils.TOR: utils.VOICE, utils.ACCID: "aaa2", utils.CDRHOST: "192.168.1.1", utils.REQTYPE: utils.META_PREPAID, utils.DIRECTION: "*out", utils.TENANT: "cgrates.org", utils.CATEGORY: "call", utils.ACCOUNT: "1001", utils.SUBJECT: "1001", utils.DESTINATION: "1002", utils.SETUP_TIME: "2013-11-08T08:42:22Z", - utils.ANSWER_TIME: "2013-11-08T08:42:26Z", utils.USAGE: "20", utils.PDD: "7s", utils.SUPPLIER: "SUPPL1", "field_extr1": "val_extr1", "fieldextr2": "valextr2", "cdrsource": utils.TEST_SQL} + utils.ANSWER_TIME: "2013-11-08T08:42:26Z", utils.USAGE: "20", utils.PDD: "7s", utils.SUPPLIER: "SUPPL1", + "field_extr1": "val_extr1", "fieldextr2": "valextr2", "Source": utils.TEST_SQL} cgrCdr3 := &CgrCdr{utils.TOR: utils.VOICE, utils.ACCID: "aaa3", utils.CDRHOST: "192.168.1.1", utils.REQTYPE: utils.META_RATED, utils.DIRECTION: "*out", utils.TENANT: "cgrates.org", utils.CATEGORY: "premium_call", utils.ACCOUNT: "1002", utils.SUBJECT: "1002", utils.DESTINATION: "1001", utils.SETUP_TIME: "2013-11-07T08:42:24Z", - utils.ANSWER_TIME: "2013-11-07T08:42:26Z", utils.USAGE: "60s", utils.PDD: "4s", utils.SUPPLIER: "SUPPL1", "field_extr1": "val_extr1", "fieldextr2": "valextr2", "cdrsource": utils.TEST_SQL} + utils.ANSWER_TIME: "2013-11-07T08:42:26Z", utils.USAGE: "60s", utils.PDD: "4s", utils.SUPPLIER: "SUPPL1", + "field_extr1": "val_extr1", "fieldextr2": "valextr2", "Source": utils.TEST_SQL} cgrCdr4 := &CgrCdr{utils.TOR: utils.VOICE, utils.ACCID: "aaa4", utils.CDRHOST: "192.168.1.2", utils.REQTYPE: utils.META_PSEUDOPREPAID, utils.DIRECTION: "*out", utils.TENANT: "itsyscom.com", utils.CATEGORY: "call", utils.ACCOUNT: "1001", utils.SUBJECT: "1001", utils.DESTINATION: "+4986517174964", utils.SETUP_TIME: "2013-11-07T08:42:21Z", - utils.ANSWER_TIME: "2013-11-07T08:42:26Z", utils.USAGE: "1m2s", utils.PDD: "4s", utils.SUPPLIER: "SUPPL1", "field_extr1": "val_extr1", "fieldextr2": "valextr2", "cdrsource": utils.TEST_SQL} + utils.ANSWER_TIME: "2013-11-07T08:42:26Z", utils.USAGE: "1m2s", utils.PDD: "4s", utils.SUPPLIER: "SUPPL1", + "field_extr1": "val_extr1", "fieldextr2": "valextr2", "Source": utils.TEST_SQL} cgrCdr5 := &CgrCdr{utils.TOR: utils.VOICE, utils.ACCID: "aaa5", utils.CDRHOST: "192.168.1.2", utils.REQTYPE: utils.META_POSTPAID, utils.DIRECTION: "*out", utils.TENANT: "itsyscom.com", utils.CATEGORY: "call", utils.ACCOUNT: "1002", utils.SUBJECT: "1002", utils.DESTINATION: "+4986517174963", utils.SETUP_TIME: "2013-11-07T08:42:25Z", - utils.ANSWER_TIME: "2013-11-07T08:42:26Z", utils.USAGE: "15s", utils.PDD: "7s", utils.SUPPLIER: "SUPPL1", "field_extr1": "val_extr1", "fieldextr2": "valextr2", "cdrsource": utils.TEST_SQL} + utils.ANSWER_TIME: "2013-11-07T08:42:26Z", utils.USAGE: "15s", utils.PDD: "7s", utils.SUPPLIER: "SUPPL1", + "field_extr1": "val_extr1", "fieldextr2": "valextr2", "Source": utils.TEST_SQL} for _, cdr := range []*CgrCdr{cgrCdr1, cgrCdr2, cgrCdr3, cgrCdr4, cgrCdr5} { if err := mongoDb.SetCdr(cdr.AsStoredCdr("")); err != nil { t.Error(err.Error()) } } - strCdr1 := &StoredCdr{TOR: utils.VOICE, AccId: "bbb1", CdrHost: "192.168.1.1", CdrSource: "UNKNOWN", ReqType: utils.META_RATED, + strCdr1 := &CDR{TOR: utils.VOICE, OriginID: "bbb1", OriginHost: "192.168.1.1", Source: "UNKNOWN", ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002", SetupTime: time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC), AnswerTime: time.Date(2013, 12, 7, 8, 42, 26, 0, time.UTC), - Usage: time.Duration(10) * time.Second, Pdd: time.Duration(3) * time.Second, Supplier: "SUPPL1", - ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, - MediationRunId: utils.DEFAULT_RUNID, Cost: 1.201} - strCdr1.CgrId = utils.Sha1(strCdr1.AccId, strCdr1.SetupTime.String()) - strCdr2 := &StoredCdr{TOR: utils.VOICE, AccId: "bbb2", CdrHost: "192.168.1.2", CdrSource: "UNKNOWN2", ReqType: utils.META_PREPAID, + Usage: time.Duration(10) * time.Second, PDD: time.Duration(3) * time.Second, Supplier: "SUPPL1", + ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, + RunID: utils.DEFAULT_RUNID, Cost: 1.201} + strCdr1.CGRID = utils.Sha1(strCdr1.OriginID, strCdr1.SetupTime.String()) + strCdr2 := &CDR{TOR: utils.VOICE, OriginID: "bbb2", OriginHost: "192.168.1.2", Source: "UNKNOWN2", ReqType: utils.META_PREPAID, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002", SetupTime: time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC), AnswerTime: time.Date(2013, 12, 7, 8, 42, 26, 0, time.UTC), - Usage: time.Duration(12) * time.Second, Pdd: time.Duration(4) * time.Second, Supplier: "SUPPL1", - ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, - MediationRunId: utils.DEFAULT_RUNID, Cost: 0.201} - strCdr2.CgrId = utils.Sha1(strCdr2.AccId, strCdr2.SetupTime.String()) - strCdr3 := &StoredCdr{TOR: utils.VOICE, AccId: "bbb3", CdrHost: "192.168.1.1", CdrSource: utils.TEST_SQL, ReqType: utils.META_RATED, + Usage: time.Duration(12) * time.Second, PDD: time.Duration(4) * time.Second, Supplier: "SUPPL1", + ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, + RunID: utils.DEFAULT_RUNID, Cost: 0.201} + strCdr2.CGRID = utils.Sha1(strCdr2.OriginID, strCdr2.SetupTime.String()) + strCdr3 := &CDR{TOR: utils.VOICE, OriginID: "bbb3", OriginHost: "192.168.1.1", Source: utils.TEST_SQL, ReqType: utils.META_RATED, Direction: "*out", Tenant: "itsyscom.com", Category: "call", Account: "1002", Subject: "1000", Destination: "+4986517174963", SetupTime: time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC), AnswerTime: time.Date(2013, 12, 7, 8, 42, 26, 0, time.UTC), - Usage: time.Duration(10) * time.Second, Pdd: time.Duration(2) * time.Second, Supplier: "SUPPL1", - ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, - MediationRunId: utils.DEFAULT_RUNID, Cost: 1.201} - strCdr3.CgrId = utils.Sha1(strCdr3.AccId, strCdr3.SetupTime.String()) + Usage: time.Duration(10) * time.Second, PDD: time.Duration(2) * time.Second, Supplier: "SUPPL1", + ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, + RunID: utils.DEFAULT_RUNID, Cost: 1.201} + strCdr3.CGRID = utils.Sha1(strCdr3.OriginID, strCdr3.SetupTime.String()) - for _, cdr := range []*StoredCdr{strCdr1, strCdr2, strCdr3} { + for _, cdr := range []*CDR{strCdr1, strCdr2, strCdr3} { if err := mongoDb.SetCdr(cdr); err != nil { t.Error(err.Error()) } @@ -515,29 +520,29 @@ func TestMongoSetRatedCdr(t *testing.T) { if !*testLocal { return } - strCdr1 := &StoredCdr{TOR: utils.VOICE, AccId: "bbb1", CdrHost: "192.168.1.1", CdrSource: "UNKNOWN", ReqType: utils.META_RATED, + strCdr1 := &CDR{TOR: utils.VOICE, OriginID: "bbb1", OriginHost: "192.168.1.1", Source: "UNKNOWN", ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002", SetupTime: time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC), AnswerTime: time.Date(2013, 12, 7, 8, 42, 26, 0, time.UTC), - Usage: time.Duration(10) * time.Second, Pdd: time.Duration(3) * time.Second, Supplier: "SUPPL1", - ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, - MediationRunId: utils.DEFAULT_RUNID, Cost: 1.201} - strCdr1.CgrId = utils.Sha1(strCdr1.AccId, strCdr1.SetupTime.String()) - strCdr2 := &StoredCdr{TOR: utils.VOICE, AccId: "bbb2", CdrHost: "192.168.1.2", CdrSource: "UNKNOWN", ReqType: utils.META_PREPAID, + Usage: time.Duration(10) * time.Second, PDD: time.Duration(3) * time.Second, Supplier: "SUPPL1", + ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, + RunID: utils.DEFAULT_RUNID, Cost: 1.201} + strCdr1.CGRID = utils.Sha1(strCdr1.OriginID, strCdr1.SetupTime.String()) + strCdr2 := &CDR{TOR: utils.VOICE, OriginID: "bbb2", OriginHost: "192.168.1.2", Source: "UNKNOWN", ReqType: utils.META_PREPAID, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002", SetupTime: time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC), AnswerTime: time.Date(2013, 12, 7, 8, 42, 26, 0, time.UTC), - Usage: time.Duration(12) * time.Second, Pdd: time.Duration(7) * time.Second, Supplier: "SUPPL1", - ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, - MediationRunId: utils.DEFAULT_RUNID, Cost: 0.201} - strCdr2.CgrId = utils.Sha1(strCdr2.AccId, strCdr2.SetupTime.String()) - strCdr3 := &StoredCdr{TOR: utils.VOICE, AccId: "bbb3", CdrHost: "192.168.1.1", CdrSource: utils.TEST_SQL, ReqType: utils.META_RATED, + Usage: time.Duration(12) * time.Second, PDD: time.Duration(7) * time.Second, Supplier: "SUPPL1", + ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, + RunID: utils.DEFAULT_RUNID, Cost: 0.201} + strCdr2.CGRID = utils.Sha1(strCdr2.OriginID, strCdr2.SetupTime.String()) + strCdr3 := &CDR{TOR: utils.VOICE, OriginID: "bbb3", OriginHost: "192.168.1.1", Source: utils.TEST_SQL, ReqType: utils.META_RATED, Direction: "*out", Tenant: "itsyscom.com", Category: "call", Account: "1002", Subject: "1002", Destination: "+4986517174964", SetupTime: time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC), AnswerTime: time.Date(2013, 12, 7, 8, 42, 26, 0, time.UTC), - Usage: time.Duration(10) * time.Second, Pdd: time.Duration(2) * time.Second, Supplier: "SUPPL1", - ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, - MediationRunId: "wholesale_run", Cost: 1.201} - strCdr3.CgrId = utils.Sha1(strCdr3.AccId, strCdr3.SetupTime.String()) + Usage: time.Duration(10) * time.Second, PDD: time.Duration(2) * time.Second, Supplier: "SUPPL1", + ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, + RunID: "wholesale_run", Cost: 1.201} + strCdr3.CGRID = utils.Sha1(strCdr3.OriginID, strCdr3.SetupTime.String()) - for _, cdr := range []*StoredCdr{strCdr1, strCdr2, strCdr3} { + for _, cdr := range []*CDR{strCdr1, strCdr2, strCdr3} { if err := mongoDb.SetRatedCdr(cdr); err != nil { t.Error(err.Error()) } @@ -548,7 +553,7 @@ func TestMongoCallCost(t *testing.T) { if !*testLocal { return } - cgrId := utils.Sha1("bbb1", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()) + CGRID := utils.Sha1("bbb1", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()) cc := &CallCost{ Direction: "*out", Category: "call", @@ -568,330 +573,318 @@ func TestMongoCallCost(t *testing.T) { }, }, } - if err := mongoDb.LogCallCost(cgrId, utils.TEST_SQL, utils.DEFAULT_RUNID, cc); err != nil { + if err := mongoDb.LogCallCost(CGRID, utils.TEST_SQL, utils.DEFAULT_RUNID, cc); err != nil { t.Error(err.Error()) } - if ccRcv, err := mongoDb.GetCallCostLog(cgrId, utils.TEST_SQL, utils.DEFAULT_RUNID); err != nil { + if ccRcv, err := mongoDb.GetCallCostLog(CGRID, utils.TEST_SQL, utils.DEFAULT_RUNID); err != nil { t.Error(err.Error()) } else if cc.Cost != ccRcv.Cost { t.Errorf("Expecting call cost:\n%+v,\nreceived:\n%+v", cc.Timespans[0], ccRcv.Timespans[0]) } // UPDATE test here cc.Category = "premium_call" - if err := mongoDb.LogCallCost(cgrId, utils.TEST_SQL, utils.DEFAULT_RUNID, cc); err != nil { + if err := mongoDb.LogCallCost(CGRID, utils.TEST_SQL, utils.DEFAULT_RUNID, cc); err != nil { t.Error(err.Error()) } - if ccRcv, err := mongoDb.GetCallCostLog(cgrId, utils.TEST_SQL, utils.DEFAULT_RUNID); err != nil { + if ccRcv, err := mongoDb.GetCallCostLog(CGRID, utils.TEST_SQL, utils.DEFAULT_RUNID); err != nil { t.Error(err.Error()) } else if cc.Cost != ccRcv.Cost { t.Errorf("Expecting call cost: %v, received: %v", cc, ccRcv) } } -func TestMongoGetStoredCdrs(t *testing.T) { +func TestMongoGetcdrs(t *testing.T) { if !*testLocal { return } var timeStart, timeEnd time.Time - // All CDRs, no filter - if storedCdrs, _, err := mongoDb.GetStoredCdrs(new(utils.CdrsFilter)); err != nil { + // All cdrs, no filter + if cdrs, _, err := mongoDb.GetCDRs(new(utils.CDRsFilter)); err != nil { t.Error(err.Error()) - } else if len(storedCdrs) != 20 { - t.Error("Unexpected number of StoredCdrs returned: ", len(storedCdrs)) + } else if len(cdrs) != 20 { + t.Error("Unexpected number of cdrs returned: ", len(cdrs)) } // Count ALL - if storedCdrs, count, err := mongoDb.GetStoredCdrs(&utils.CdrsFilter{Count: true}); err != nil { + if cdrs, count, err := mongoDb.GetCDRs(&utils.CDRsFilter{Count: true}); err != nil { t.Error(err.Error()) - } else if len(storedCdrs) != 0 { - t.Error("Unexpected number of StoredCdrs returned: ", len(storedCdrs)) + } else if len(cdrs) != 0 { + t.Error("Unexpected number of cdrs returned: ", len(cdrs)) } else if count != 20 { - t.Error("Unexpected count of StoredCdrs returned: ", count) + t.Error("Unexpected count of cdrs returned: ", count) } // Limit 5 - if storedCdrs, _, err := mongoDb.GetStoredCdrs(&utils.CdrsFilter{Paginator: utils.Paginator{Limit: utils.IntPointer(5), Offset: utils.IntPointer(0)}}); err != nil { + if cdrs, _, err := mongoDb.GetCDRs(&utils.CDRsFilter{Paginator: utils.Paginator{Limit: utils.IntPointer(5), Offset: utils.IntPointer(0)}}); err != nil { t.Error(err.Error()) - } else if len(storedCdrs) != 5 { - t.Error("Unexpected number of StoredCdrs returned: ", len(storedCdrs)) + } else if len(cdrs) != 5 { + t.Error("Unexpected number of cdrs returned: ", len(cdrs)) } // Offset 5 - if storedCdrs, _, err := mongoDb.GetStoredCdrs(&utils.CdrsFilter{Paginator: utils.Paginator{Limit: utils.IntPointer(5), Offset: utils.IntPointer(0)}}); err != nil { + if cdrs, _, err := mongoDb.GetCDRs(&utils.CDRsFilter{Paginator: utils.Paginator{Limit: utils.IntPointer(5), Offset: utils.IntPointer(0)}}); err != nil { t.Error(err.Error()) - } else if len(storedCdrs) != 5 { - t.Error("Unexpected number of StoredCdrs returned: ", len(storedCdrs)) + } else if len(cdrs) != 5 { + t.Error("Unexpected number of cdrs returned: ", len(cdrs)) } // Offset with limit 2 - if storedCdrs, _, err := mongoDb.GetStoredCdrs(&utils.CdrsFilter{Paginator: utils.Paginator{Limit: utils.IntPointer(2), Offset: utils.IntPointer(5)}}); err != nil { + if cdrs, _, err := mongoDb.GetCDRs(&utils.CDRsFilter{Paginator: utils.Paginator{Limit: utils.IntPointer(2), Offset: utils.IntPointer(5)}}); err != nil { t.Error(err.Error()) - } else if len(storedCdrs) != 2 { - t.Error("Unexpected number of StoredCdrs returned: ", len(storedCdrs)) + } else if len(cdrs) != 2 { + t.Error("Unexpected number of cdrs returned: ", len(cdrs)) } - // Filter on cgrids - if storedCdrs, _, err := mongoDb.GetStoredCdrs(&utils.CdrsFilter{CgrIds: []string{utils.Sha1("bbb1", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()), + // Filter on CGRIDs + if cdrs, _, err := mongoDb.GetCDRs(&utils.CDRsFilter{CGRIDs: []string{utils.Sha1("bbb1", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()), utils.Sha1("bbb2", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String())}}); err != nil { t.Error(err.Error()) - } else if len(storedCdrs) != 3 { - t.Error("Unexpected number of StoredCdrs returned: ", len(storedCdrs)) + } else if len(cdrs) != 3 { + t.Error("Unexpected number of cdrs returned: ", len(cdrs)) } // Count on CGRIDS - if _, count, err := mongoDb.GetStoredCdrs(&utils.CdrsFilter{CgrIds: []string{utils.Sha1("bbb1", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()), + if _, count, err := mongoDb.GetCDRs(&utils.CDRsFilter{CGRIDs: []string{utils.Sha1("bbb1", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()), utils.Sha1("bbb2", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String())}, Count: true}); err != nil { t.Error(err.Error()) } else if count != 3 { - t.Error("Unexpected count of StoredCdrs returned: ", count) + t.Error("Unexpected count of cdrs returned: ", count) } - // Filter on cgrids plus reqType - if storedCdrs, _, err := mongoDb.GetStoredCdrs(&utils.CdrsFilter{CgrIds: []string{utils.Sha1("bbb1", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()), + // Filter on CGRIDs plus reqType + if cdrs, _, err := mongoDb.GetCDRs(&utils.CDRsFilter{CGRIDs: []string{utils.Sha1("bbb1", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()), utils.Sha1("bbb2", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String())}, ReqTypes: []string{utils.META_PREPAID}}); err != nil { t.Error(err.Error()) - } else if len(storedCdrs) != 1 { - t.Error("Unexpected number of StoredCdrs returned: ", len(storedCdrs)) + } else if len(cdrs) != 1 { + t.Error("Unexpected number of cdrs returned: ", len(cdrs)) } // Count on multiple filter - if _, count, err := mongoDb.GetStoredCdrs(&utils.CdrsFilter{CgrIds: []string{utils.Sha1("bbb1", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()), + if _, count, err := mongoDb.GetCDRs(&utils.CDRsFilter{CGRIDs: []string{utils.Sha1("bbb1", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()), utils.Sha1("bbb2", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String())}, ReqTypes: []string{utils.META_PREPAID}, Count: true}); err != nil { t.Error(err.Error()) } else if count != 1 { - t.Error("Unexpected count of StoredCdrs returned: ", count) + t.Error("Unexpected count of cdrs returned: ", count) } // Filter on runId - if storedCdrs, _, err := mongoDb.GetStoredCdrs(&utils.CdrsFilter{RunIds: []string{utils.DEFAULT_RUNID}}); err != nil { + if cdrs, _, err := mongoDb.GetCDRs(&utils.CDRsFilter{RunIDs: []string{utils.DEFAULT_RUNID}}); err != nil { t.Error(err.Error()) - } else if len(storedCdrs) != 14 { - t.Error("Unexpected number of StoredCdrs returned: ", len(storedCdrs)) + } else if len(cdrs) != 14 { + t.Error("Unexpected number of cdrs returned: ", len(cdrs)) } // Filter on TOR - if storedCdrs, _, err := mongoDb.GetStoredCdrs(&utils.CdrsFilter{Tors: []string{utils.SMS}}); err != nil { + if cdrs, _, err := mongoDb.GetCDRs(&utils.CDRsFilter{TORs: []string{utils.SMS}}); err != nil { t.Error(err.Error()) - } else if len(storedCdrs) != 0 { - t.Error("Unexpected number of StoredCdrs returned: ", len(storedCdrs)) + } else if len(cdrs) != 0 { + t.Error("Unexpected number of cdrs returned: ", len(cdrs)) } // Filter on multiple TOR - if storedCdrs, _, err := mongoDb.GetStoredCdrs(&utils.CdrsFilter{Tors: []string{utils.SMS, utils.VOICE}}); err != nil { + if cdrs, _, err := mongoDb.GetCDRs(&utils.CDRsFilter{TORs: []string{utils.SMS, utils.VOICE}}); err != nil { t.Error(err.Error()) - } else if len(storedCdrs) != 15 { - t.Error("Unexpected number of StoredCdrs returned: ", len(storedCdrs)) + } else if len(cdrs) != 15 { + t.Error("Unexpected number of cdrs returned: ", len(cdrs)) } - // Filter on cdrHost - if storedCdrs, _, err := mongoDb.GetStoredCdrs(&utils.CdrsFilter{CdrHosts: []string{"192.168.1.2"}}); err != nil { + // Filter on OriginHost + if cdrs, _, err := mongoDb.GetCDRs(&utils.CDRsFilter{OriginHosts: []string{"192.168.1.2"}}); err != nil { t.Error(err.Error()) - } else if len(storedCdrs) != 3 { - t.Error("Unexpected number of StoredCdrs returned: ", len(storedCdrs)) + } else if len(cdrs) != 3 { + t.Error("Unexpected number of cdrs returned: ", len(cdrs)) } - // Filter on multiple cdrHost - if storedCdrs, _, err := mongoDb.GetStoredCdrs(&utils.CdrsFilter{CdrHosts: []string{"192.168.1.1", "192.168.1.2"}}); err != nil { + // Filter on multiple OriginHost + if cdrs, _, err := mongoDb.GetCDRs(&utils.CDRsFilter{OriginHosts: []string{"192.168.1.1", "192.168.1.2"}}); err != nil { t.Error(err.Error()) - } else if len(storedCdrs) != 15 { - t.Error("Unexpected number of StoredCdrs returned: ", len(storedCdrs)) + } else if len(cdrs) != 15 { + t.Error("Unexpected number of cdrs returned: ", len(cdrs)) } - // Filter on cdrSource - if storedCdrs, _, err := mongoDb.GetStoredCdrs(&utils.CdrsFilter{CdrSources: []string{"UNKNOWN"}}); err != nil { + // Filter on Source + if cdrs, _, err := mongoDb.GetCDRs(&utils.CDRsFilter{Sources: []string{"UNKNOWN"}}); err != nil { t.Error(err.Error()) - } else if len(storedCdrs) != 2 { - t.Error("Unexpected number of StoredCdrs returned: ", len(storedCdrs)) + } else if len(cdrs) != 2 { + t.Error("Unexpected number of cdrs returned: ", len(cdrs)) } - // Filter on multiple cdrSource - if storedCdrs, _, err := mongoDb.GetStoredCdrs(&utils.CdrsFilter{CdrSources: []string{"UNKNOWN", "UNKNOWN2"}}); err != nil { + // Filter on multiple Source + if cdrs, _, err := mongoDb.GetCDRs(&utils.CDRsFilter{Sources: []string{"UNKNOWN", "UNKNOWN2"}}); err != nil { t.Error(err.Error()) - } else if len(storedCdrs) != 2 { - t.Error("Unexpected number of StoredCdrs returned: ", len(storedCdrs)) + } else if len(cdrs) != 2 { + t.Error("Unexpected number of cdrs returned: ", len(cdrs)) } // Filter on reqType - if storedCdrs, _, err := mongoDb.GetStoredCdrs(&utils.CdrsFilter{ReqTypes: []string{utils.META_PREPAID}}); err != nil { + if cdrs, _, err := mongoDb.GetCDRs(&utils.CDRsFilter{ReqTypes: []string{utils.META_PREPAID}}); err != nil { t.Error(err.Error()) - } else if len(storedCdrs) != 5 { - t.Error("Unexpected number of StoredCdrs returned: ", len(storedCdrs)) + } else if len(cdrs) != 5 { + t.Error("Unexpected number of cdrs returned: ", len(cdrs)) } // Filter on multiple reqType - if storedCdrs, _, err := mongoDb.GetStoredCdrs(&utils.CdrsFilter{ReqTypes: []string{utils.META_PREPAID, utils.META_PSEUDOPREPAID}}); err != nil { + if cdrs, _, err := mongoDb.GetCDRs(&utils.CDRsFilter{ReqTypes: []string{utils.META_PREPAID, utils.META_PSEUDOPREPAID}}); err != nil { t.Error(err.Error()) - } else if len(storedCdrs) != 6 { - t.Error("Unexpected number of StoredCdrs returned: ", len(storedCdrs)) + } else if len(cdrs) != 6 { + t.Error("Unexpected number of cdrs returned: ", len(cdrs)) } // Filter on direction - if storedCdrs, _, err := mongoDb.GetStoredCdrs(&utils.CdrsFilter{Directions: []string{"*out"}}); err != nil { + if cdrs, _, err := mongoDb.GetCDRs(&utils.CDRsFilter{Directions: []string{"*out"}}); err != nil { t.Error(err.Error()) - } else if len(storedCdrs) != 15 { - t.Error("Unexpected number of StoredCdrs returned: ", len(storedCdrs)) + } else if len(cdrs) != 15 { + t.Error("Unexpected number of cdrs returned: ", len(cdrs)) } // Filter on tenant - if storedCdrs, _, err := mongoDb.GetStoredCdrs(&utils.CdrsFilter{Tenants: []string{"itsyscom.com"}}); err != nil { + if cdrs, _, err := mongoDb.GetCDRs(&utils.CDRsFilter{Tenants: []string{"itsyscom.com"}}); err != nil { t.Error(err.Error()) - } else if len(storedCdrs) != 4 { - t.Error("Unexpected number of StoredCdrs returned: ", len(storedCdrs)) + } else if len(cdrs) != 4 { + t.Error("Unexpected number of cdrs returned: ", len(cdrs)) } // Filter on multiple tenants - if storedCdrs, _, err := mongoDb.GetStoredCdrs(&utils.CdrsFilter{Tenants: []string{"itsyscom.com", "cgrates.org"}}); err != nil { + if cdrs, _, err := mongoDb.GetCDRs(&utils.CDRsFilter{Tenants: []string{"itsyscom.com", "cgrates.org"}}); err != nil { t.Error(err.Error()) - } else if len(storedCdrs) != 15 { - t.Error("Unexpected number of StoredCdrs returned: ", len(storedCdrs)) + } else if len(cdrs) != 15 { + t.Error("Unexpected number of cdrs returned: ", len(cdrs)) } // Filter on category - if storedCdrs, _, err := mongoDb.GetStoredCdrs(&utils.CdrsFilter{Categories: []string{"premium_call"}}); err != nil { + if cdrs, _, err := mongoDb.GetCDRs(&utils.CDRsFilter{Categories: []string{"premium_call"}}); err != nil { t.Error(err.Error()) - } else if len(storedCdrs) != 1 { - t.Error("Unexpected number of StoredCdrs returned: ", len(storedCdrs)) + } else if len(cdrs) != 1 { + t.Error("Unexpected number of cdrs returned: ", len(cdrs)) } // Filter on multiple categories - if storedCdrs, _, err := mongoDb.GetStoredCdrs(&utils.CdrsFilter{Categories: []string{"premium_call", "call"}}); err != nil { + if cdrs, _, err := mongoDb.GetCDRs(&utils.CDRsFilter{Categories: []string{"premium_call", "call"}}); err != nil { t.Error(err.Error()) - } else if len(storedCdrs) != 15 { - t.Error("Unexpected number of StoredCdrs returned: ", len(storedCdrs)) + } else if len(cdrs) != 15 { + t.Error("Unexpected number of cdrs returned: ", len(cdrs)) } // Filter on account - if storedCdrs, _, err := mongoDb.GetStoredCdrs(&utils.CdrsFilter{Accounts: []string{"1002"}}); err != nil { + if cdrs, _, err := mongoDb.GetCDRs(&utils.CDRsFilter{Accounts: []string{"1002"}}); err != nil { t.Error(err.Error()) - } else if len(storedCdrs) != 6 { - t.Error("Unexpected number of StoredCdrs returned: ", len(storedCdrs)) + } else if len(cdrs) != 6 { + t.Error("Unexpected number of cdrs returned: ", len(cdrs)) } // Filter on multiple account - if storedCdrs, _, err := mongoDb.GetStoredCdrs(&utils.CdrsFilter{Accounts: []string{"1001", "1002"}}); err != nil { + if cdrs, _, err := mongoDb.GetCDRs(&utils.CDRsFilter{Accounts: []string{"1001", "1002"}}); err != nil { t.Error(err.Error()) - } else if len(storedCdrs) != 13 { - t.Error("Unexpected number of StoredCdrs returned: ", len(storedCdrs)) + } else if len(cdrs) != 13 { + t.Error("Unexpected number of cdrs returned: ", len(cdrs)) } // Filter on subject - if storedCdrs, _, err := mongoDb.GetStoredCdrs(&utils.CdrsFilter{Subjects: []string{"1000"}}); err != nil { + if cdrs, _, err := mongoDb.GetCDRs(&utils.CDRsFilter{Subjects: []string{"1000"}}); err != nil { t.Error(err.Error()) - } else if len(storedCdrs) != 1 { - t.Error("Unexpected number of StoredCdrs returned: ", len(storedCdrs)) + } else if len(cdrs) != 1 { + t.Error("Unexpected number of cdrs returned: ", len(cdrs)) } // Filter on multiple subject - if storedCdrs, _, err := mongoDb.GetStoredCdrs(&utils.CdrsFilter{Subjects: []string{"1000", "1002"}}); err != nil { + if cdrs, _, err := mongoDb.GetCDRs(&utils.CDRsFilter{Subjects: []string{"1000", "1002"}}); err != nil { t.Error(err.Error()) - } else if len(storedCdrs) != 6 { - t.Error("Unexpected number of StoredCdrs returned: ", len(storedCdrs)) + } else if len(cdrs) != 6 { + t.Error("Unexpected number of cdrs returned: ", len(cdrs)) } // Filter on destPrefix - if storedCdrs, _, err := mongoDb.GetStoredCdrs(&utils.CdrsFilter{DestPrefixes: []string{"+498651"}}); err != nil { + if cdrs, _, err := mongoDb.GetCDRs(&utils.CDRsFilter{DestinationPrefixes: []string{"+498651"}}); err != nil { t.Error(err.Error()) - } else if len(storedCdrs) != 4 { - t.Error("Unexpected number of StoredCdrs returned: ", len(storedCdrs)) + } else if len(cdrs) != 4 { + t.Error("Unexpected number of cdrs returned: ", len(cdrs)) } - // Filter on multiple destPrefixes - if storedCdrs, _, err := mongoDb.GetStoredCdrs(&utils.CdrsFilter{DestPrefixes: []string{"1001", "+498651"}}); err != nil { + // Filter on multiple DestinationPrefixes + if cdrs, _, err := mongoDb.GetCDRs(&utils.CDRsFilter{DestinationPrefixes: []string{"1001", "+498651"}}); err != nil { t.Error(err.Error()) - } else if len(storedCdrs) != 5 { - t.Error("Unexpected number of StoredCdrs returned: ", len(storedCdrs)) - } - // Filter on ratedAccount - if storedCdrs, _, err := mongoDb.GetStoredCdrs(&utils.CdrsFilter{RatedAccounts: []string{"8001"}}); err != nil { - t.Error(err.Error()) - } else if len(storedCdrs) != 1 { - t.Error("Unexpected number of StoredCdrs returned: ", len(storedCdrs)) - } - // Filter on ratedSubject - if storedCdrs, _, err := mongoDb.GetStoredCdrs(&utils.CdrsFilter{RatedSubjects: []string{"91001"}}); err != nil { - t.Error(err.Error()) - } else if len(storedCdrs) != 1 { - t.Error("Unexpected number of StoredCdrs returned: ", len(storedCdrs)) + } else if len(cdrs) != 5 { + t.Error("Unexpected number of cdrs returned: ", len(cdrs)) } // Filter on ignoreRated - var orderIdStart, orderIdEnd int64 // Capture also orderIds for the next test - if storedCdrs, _, err := mongoDb.GetStoredCdrs(&utils.CdrsFilter{MaxCost: utils.Float64Pointer(0.0)}); err != nil { + var OrderIDStart, OrderIDEnd int64 // Capture also OrderIDs for the next test + if cdrs, _, err := mongoDb.GetCDRs(&utils.CDRsFilter{MaxCost: utils.Float64Pointer(0.0)}); err != nil { t.Error(err.Error()) - } else if len(storedCdrs) != 7 { - t.Error("Unexpected number of StoredCdrs returned: ", len(storedCdrs)) + } else if len(cdrs) != 7 { + t.Error("Unexpected number of cdrs returned: ", len(cdrs)) } else { - for _, cdr := range storedCdrs { - if cdr.OrderId < orderIdStart { - orderIdStart = cdr.OrderId + for _, cdr := range cdrs { + if cdr.OrderID < OrderIDStart { + OrderIDStart = cdr.OrderID } - if cdr.OrderId > orderIdEnd { - orderIdEnd = cdr.OrderId + if cdr.OrderID > OrderIDEnd { + OrderIDEnd = cdr.OrderID } } } - // Filter on orderIdStart - if storedCdrs, _, err := mongoDb.GetStoredCdrs(&utils.CdrsFilter{OrderIdStart: orderIdStart}); err != nil { + // Filter on OrderIDStart + if cdrs, _, err := mongoDb.GetCDRs(&utils.CDRsFilter{OrderIDStart: OrderIDStart}); err != nil { t.Error(err.Error()) - } else if len(storedCdrs) != 20 { - t.Error("Unexpected number of StoredCdrs returned: ", len(storedCdrs)) + } else if len(cdrs) != 20 { + t.Error("Unexpected number of cdrs returned: ", len(cdrs)) } - // Filter on orderIdStart and orderIdEnd - if storedCdrs, _, err := mongoDb.GetStoredCdrs(&utils.CdrsFilter{OrderIdStart: orderIdStart, OrderIdEnd: orderIdEnd}); err != nil { + // Filter on OrderIDStart and OrderIDEnd + if cdrs, _, err := mongoDb.GetCDRs(&utils.CDRsFilter{OrderIDStart: OrderIDStart, OrderIDEnd: OrderIDEnd}); err != nil { t.Error(err.Error()) - } else if len(storedCdrs) != 20 { // TODO: find mongo equivalent - t.Error("Unexpected number of StoredCdrs returned: ", len(storedCdrs)) + } else if len(cdrs) != 20 { // TODO: find mongo equivalent + t.Error("Unexpected number of cdrs returned: ", len(cdrs)) } // Filter on timeStart timeStart = time.Date(2013, 11, 8, 8, 0, 0, 0, time.UTC) - if storedCdrs, _, err := mongoDb.GetStoredCdrs(&utils.CdrsFilter{AnswerTimeStart: &timeStart}); err != nil { + if cdrs, _, err := mongoDb.GetCDRs(&utils.CDRsFilter{AnswerTimeStart: &timeStart}); err != nil { t.Error(err.Error()) - } else if len(storedCdrs) != 6 { - t.Error("Unexpected number of StoredCdrs returned: ", len(storedCdrs)) + } else if len(cdrs) != 6 { + t.Error("Unexpected number of cdrs returned: ", len(cdrs)) } // Filter on timeStart and timeEnd timeEnd = time.Date(2013, 12, 1, 8, 0, 0, 0, time.UTC) - if storedCdrs, _, err := mongoDb.GetStoredCdrs(&utils.CdrsFilter{AnswerTimeStart: &timeStart, AnswerTimeEnd: &timeEnd}); err != nil { + if cdrs, _, err := mongoDb.GetCDRs(&utils.CDRsFilter{AnswerTimeStart: &timeStart, AnswerTimeEnd: &timeEnd}); err != nil { t.Error(err.Error()) - } else if len(storedCdrs) != 2 { - t.Error("Unexpected number of StoredCdrs returned: ", len(storedCdrs)) + } else if len(cdrs) != 2 { + t.Error("Unexpected number of cdrs returned: ", len(cdrs)) } - // Filter on minPdd - if storedCdrs, _, err := mongoDb.GetStoredCdrs(&utils.CdrsFilter{MinPdd: utils.Float64Pointer(float64(3 * time.Second))}); err != nil { + // Filter on minPDD + if cdrs, _, err := mongoDb.GetCDRs(&utils.CDRsFilter{MinPDD: utils.Float64Pointer(float64(3 * time.Second))}); err != nil { t.Error(err.Error()) - } else if len(storedCdrs) != 7 { - t.Error("Unexpected number of StoredCdrs returned: ", len(storedCdrs)) + } else if len(cdrs) != 7 { + t.Error("Unexpected number of cdrs returned: ", len(cdrs)) } - // Filter on maxPdd - if storedCdrs, _, err := mongoDb.GetStoredCdrs(&utils.CdrsFilter{MaxPdd: utils.Float64Pointer(float64(3 * time.Second))}); err != nil { + // Filter on maxPDD + if cdrs, _, err := mongoDb.GetCDRs(&utils.CDRsFilter{MaxPDD: utils.Float64Pointer(float64(3 * time.Second))}); err != nil { t.Error(err.Error()) - } else if len(storedCdrs) != 13 { - t.Error("Unexpected number of StoredCdrs returned: ", len(storedCdrs)) + } else if len(cdrs) != 13 { + t.Error("Unexpected number of cdrs returned: ", len(cdrs)) } - // Filter on minPdd, maxPdd - if storedCdrs, _, err := mongoDb.GetStoredCdrs(&utils.CdrsFilter{MinPdd: utils.Float64Pointer(float64(3 * time.Second)), MaxPdd: utils.Float64Pointer(float64(5 * time.Second))}); err != nil { + // Filter on minPDD, maxPDD + if cdrs, _, err := mongoDb.GetCDRs(&utils.CDRsFilter{MinPDD: utils.Float64Pointer(float64(3 * time.Second)), MaxPDD: utils.Float64Pointer(float64(5 * time.Second))}); err != nil { t.Error(err.Error()) - } else if len(storedCdrs) != 4 { - t.Error("Unexpected number of StoredCdrs returned: ", len(storedCdrs)) + } else if len(cdrs) != 4 { + t.Error("Unexpected number of cdrs returned: ", len(cdrs)) } // Combined filter - if storedCdrs, _, err := mongoDb.GetStoredCdrs(&utils.CdrsFilter{ReqTypes: []string{utils.META_RATED}, AnswerTimeStart: &timeStart, AnswerTimeEnd: &timeEnd}); err != nil { + if cdrs, _, err := mongoDb.GetCDRs(&utils.CDRsFilter{ReqTypes: []string{utils.META_RATED}, AnswerTimeStart: &timeStart, AnswerTimeEnd: &timeEnd}); err != nil { t.Error(err.Error()) - } else if len(storedCdrs) != 1 { - t.Error("Unexpected number of StoredCdrs returned: ", len(storedCdrs)) + } else if len(cdrs) != 1 { + t.Error("Unexpected number of cdrs returned: ", len(cdrs)) } // Filter on ignoreDerived - if storedCdrs, _, err := mongoDb.GetStoredCdrs(&utils.CdrsFilter{AnswerTimeStart: &timeStart, AnswerTimeEnd: &timeEnd, FilterOnRated: true}); err != nil { + if cdrs, _, err := mongoDb.GetCDRs(&utils.CDRsFilter{AnswerTimeStart: &timeStart, AnswerTimeEnd: &timeEnd, FilterOnRated: true}); err != nil { t.Error(err.Error()) - } else if len(storedCdrs) != 2 { // ToDo: Recheck this value - t.Error("Unexpected number of StoredCdrs returned: ", len(storedCdrs)) + } else if len(cdrs) != 2 { // ToDo: Recheck this value + t.Error("Unexpected number of cdrs returned: ", len(cdrs)) } } -func TestMongoRemStoredCdrs(t *testing.T) { +func TestMongoRemCDRs(t *testing.T) { if !*testLocal { return } - cgrIdB1 := utils.Sha1("bbb1", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()) - if err := mongoDb.RemStoredCdrs([]string{cgrIdB1}); err != nil { + CGRIDB1 := utils.Sha1("bbb1", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()) + if err := mongoDb.RemCDRs([]string{CGRIDB1}); err != nil { t.Error(err.Error()) } - if storedCdrs, _, err := mongoDb.GetStoredCdrs(new(utils.CdrsFilter)); err != nil { + if cdrs, _, err := mongoDb.GetCDRs(new(utils.CDRsFilter)); err != nil { t.Error(err.Error()) - } else if len(storedCdrs) != 20 { - t.Error("Unexpected number of StoredCdrs returned: ", len(storedCdrs)) + } else if len(cdrs) != 20 { + t.Error("Unexpected number of cdrs returned: ", len(cdrs)) } tm, _ := utils.ParseTimeDetectLayout("2013-11-08T08:42:20Z", "") - cgrIdA1 := utils.Sha1("aaa1", tm.String()) + CGRIDA1 := utils.Sha1("aaa1", tm.String()) tm, _ = utils.ParseTimeDetectLayout("2013-11-08T08:42:22Z", "") - cgrIdA2 := utils.Sha1("aaa2", tm.String()) + CGRIDA2 := utils.Sha1("aaa2", tm.String()) tm, _ = utils.ParseTimeDetectLayout("2013-11-07T08:42:24Z", "") - cgrIdA3 := utils.Sha1("aaa3", tm.String()) + CGRIDA3 := utils.Sha1("aaa3", tm.String()) tm, _ = utils.ParseTimeDetectLayout("2013-11-07T08:42:21Z", "") - cgrIdA4 := utils.Sha1("aaa4", tm.String()) + CGRIDA4 := utils.Sha1("aaa4", tm.String()) tm, _ = utils.ParseTimeDetectLayout("2013-11-07T08:42:25Z", "") - cgrIdA5 := utils.Sha1("aaa5", tm.String()) - cgrIdB2 := utils.Sha1("bbb2", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()) - cgrIdB3 := utils.Sha1("bbb3", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()) - if err := mongoDb.RemStoredCdrs([]string{cgrIdA1, cgrIdA2, cgrIdA3, cgrIdA4, cgrIdA5, - cgrIdB2, cgrIdB3}); err != nil { + CGRIDA5 := utils.Sha1("aaa5", tm.String()) + CGRIDB2 := utils.Sha1("bbb2", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()) + CGRIDB3 := utils.Sha1("bbb3", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()) + if err := mongoDb.RemCDRs([]string{CGRIDA1, CGRIDA2, CGRIDA3, CGRIDA4, CGRIDA5, + CGRIDB2, CGRIDB3}); err != nil { t.Error(err.Error()) } - if storedCdrs, _, err := mongoDb.GetStoredCdrs(new(utils.CdrsFilter)); err != nil { + if cdrs, _, err := mongoDb.GetCDRs(new(utils.CDRsFilter)); err != nil { t.Error(err.Error()) - } else if len(storedCdrs) != 20 { - t.Error("Unexpected number of StoredCdrs returned: ", len(storedCdrs)) + } else if len(cdrs) != 20 { + t.Error("Unexpected number of cdrs returned: ", len(cdrs)) } } @@ -900,13 +893,13 @@ func TestMongoStoreRestoreCdr(t *testing.T) { if !*testLocal { return } - strCdr := &StoredCdr{TOR: utils.VOICE, AccId: "ccc1", CdrHost: "192.168.1.1", CdrSource: "TEST_CDR", ReqType: utils.META_RATED, + strCdr := &CDR{TOR: utils.VOICE, OriginID: "ccc1", OriginHost: "192.168.1.1", Source: "TEST_CDR", ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002", SetupTime: time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC), AnswerTime: time.Date(2013, 12, 7, 8, 42, 26, 0, time.UTC), - Usage: time.Duration(10) * time.Second, Pdd: time.Duration(3) * time.Second, Supplier: "SUPPL1", - ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, - MediationRunId: utils.DEFAULT_RUNID, Cost: 1.201} - strCdr.CgrId = utils.Sha1(strCdr.AccId, strCdr.SetupTime.String()) + Usage: time.Duration(10) * time.Second, PDD: time.Duration(3) * time.Second, Supplier: "SUPPL1", + ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, + RunID: utils.DEFAULT_RUNID, Cost: 1.201} + strCdr.CGRID = utils.Sha1(strCdr.OriginID, strCdr.SetupTime.String()) if err := mongoDb.SetCdr(strCdr); err != nil { t.Error(err.Error()) } @@ -914,16 +907,16 @@ func TestMongoStoreRestoreCdr(t *testing.T) { t.Error(err.Error()) } // Check RawCdr - if rcvCdrs, _, err := mongoDb.GetStoredCdrs(&utils.CdrsFilter{CgrIds: []string{strCdr.CgrId}}); err != nil { + if rcvcdrs, _, err := mongoDb.GetCDRs(&utils.CDRsFilter{CGRIDs: []string{strCdr.CGRID}}); err != nil { t.Error(err.Error()) - } else if len(rcvCdrs) != 1 { - t.Errorf("Unexpected cdrs returned: %+v", rcvCdrs) + } else if len(rcvcdrs) != 1 { + t.Errorf("Unexpected cdrs returned: %+v", rcvcdrs) } else { - rcvCdr := rcvCdrs[0] - if strCdr.CgrId != rcvCdr.CgrId || + rcvCdr := rcvcdrs[0] + if strCdr.CGRID != rcvCdr.CGRID || strCdr.TOR != rcvCdr.TOR || - strCdr.AccId != rcvCdr.AccId || - strCdr.CdrHost != rcvCdr.CdrHost || + strCdr.OriginID != rcvCdr.OriginID || + strCdr.OriginHost != rcvCdr.OriginHost || strCdr.ReqType != rcvCdr.ReqType || strCdr.Direction != rcvCdr.Direction || strCdr.Tenant != rcvCdr.Tenant || @@ -934,24 +927,24 @@ func TestMongoStoreRestoreCdr(t *testing.T) { !strCdr.SetupTime.Equal(rcvCdr.SetupTime) || !strCdr.AnswerTime.Equal(rcvCdr.AnswerTime) || strCdr.Usage != rcvCdr.Usage || - strCdr.Pdd != rcvCdr.Pdd || + strCdr.PDD != rcvCdr.PDD || strCdr.Supplier != rcvCdr.Supplier || strCdr.DisconnectCause != rcvCdr.DisconnectCause || !reflect.DeepEqual(strCdr.ExtraFields, rcvCdr.ExtraFields) { - t.Errorf("Expecting: %+v, received: %+v", strCdr, rcvCdrs[0]) + t.Errorf("Expecting: %+v, received: %+v", strCdr, rcvcdrs[0]) } } // Check RatedCdr - if rcvCdrs, _, err := mongoDb.GetStoredCdrs(&utils.CdrsFilter{CgrIds: []string{strCdr.CgrId}, FilterOnRated: true}); err != nil { + if rcvcdrs, _, err := mongoDb.GetCDRs(&utils.CDRsFilter{CGRIDs: []string{strCdr.CGRID}, FilterOnRated: true}); err != nil { t.Error(err.Error()) - } else if len(rcvCdrs) != 1 { - t.Errorf("Unexpected cdrs returned: %+v", rcvCdrs) + } else if len(rcvcdrs) != 1 { + t.Errorf("Unexpected cdrs returned: %+v", rcvcdrs) } else { - rcvCdr := rcvCdrs[0] - if strCdr.CgrId != rcvCdr.CgrId || + rcvCdr := rcvcdrs[0] + if strCdr.CGRID != rcvCdr.CGRID || strCdr.TOR != rcvCdr.TOR || - strCdr.AccId != rcvCdr.AccId || - strCdr.CdrHost != rcvCdr.CdrHost || + strCdr.OriginID != rcvCdr.OriginID || + strCdr.OriginHost != rcvCdr.OriginHost || strCdr.ReqType != rcvCdr.ReqType || strCdr.Direction != rcvCdr.Direction || strCdr.Tenant != rcvCdr.Tenant || @@ -962,12 +955,12 @@ func TestMongoStoreRestoreCdr(t *testing.T) { //!strCdr.SetupTime.Equal(rcvCdr.SetupTime) || // FixMe //!strCdr.AnswerTime.Equal(rcvCdr.AnswerTime) || // FixMe strCdr.Usage != rcvCdr.Usage || - strCdr.Pdd != rcvCdr.Pdd || + strCdr.PDD != rcvCdr.PDD || strCdr.Supplier != rcvCdr.Supplier || strCdr.DisconnectCause != rcvCdr.DisconnectCause || strCdr.Cost != rcvCdr.Cost || !reflect.DeepEqual(strCdr.ExtraFields, rcvCdr.ExtraFields) { - t.Errorf("Expecting: %+v, received: %+v", strCdr, rcvCdrs[0]) + t.Errorf("Expecting: %+v, received: %+v", strCdr, rcvcdrs[0]) } } } diff --git a/engine/storage_mongo_tp.go b/engine/storage_mongo_tp.go index 9a30c5287..5e33a46f0 100644 --- a/engine/storage_mongo_tp.go +++ b/engine/storage_mongo_tp.go @@ -699,35 +699,35 @@ func (ms *MongoStorage) LogActionPlan(source string, at *ActionPlan, as Actions) } func (ms *MongoStorage) LogCallCost(cgrid, source, runid string, cc *CallCost) error { - s := &StoredCdr{ - CgrId: cgrid, - CdrSource: source, - MediationRunId: runid, - CostDetails: cc, + s := &CDR{ + CGRID: cgrid, + Source: source, + RunID: runid, + CostDetails: cc, } _, err := ms.db.C(colCdrs).Upsert(bson.M{"cgrid": cgrid, "cdrsource": source, "mediationrunid": runid}, s) return err } func (ms *MongoStorage) GetCallCostLog(cgrid, source, runid string) (cc *CallCost, err error) { - result := StoredCdr{} + result := CDR{} err = ms.db.C(colCdrs).Find(bson.M{"cgrid": cgrid, "cdrsource": source, "mediationrunid": runid}).One(&result) cc = result.CostDetails return } -func (ms *MongoStorage) SetCdr(cdr *StoredCdr) error { - _, err := ms.db.C(colCdrs).Upsert(bson.M{"cgrid": cdr.CgrId, "mediationrunid": cdr.MediationRunId}, cdr) +func (ms *MongoStorage) SetCdr(cdr *CDR) error { + _, err := ms.db.C(colCdrs).Upsert(bson.M{"cgrid": cdr.CGRID, "mediationrunid": cdr.RunID}, cdr) return err } -func (ms *MongoStorage) SetRatedCdr(storedCdr *StoredCdr) error { - _, err := ms.db.C(colCdrs).Upsert(bson.M{"cgrid": storedCdr.CgrId, "mediationrunid": storedCdr.MediationRunId}, storedCdr) +func (ms *MongoStorage) SetRatedCdr(cdr *CDR) error { + _, err := ms.db.C(colCdrs).Upsert(bson.M{"cgrid": cdr.CGRID, "mediationrunid": cdr.RunID}, cdr) return err } // Remove CDR data out of all CDR tables based on their cgrid -func (ms *MongoStorage) RemStoredCdrs(cgrIds []string) error { +func (ms *MongoStorage) RemCDRs(cgrIds []string) error { if len(cgrIds) == 0 { return nil } @@ -759,13 +759,13 @@ func (ms *MongoStorage) cleanEmptyFilters(filters bson.M) { } } -func (ms *MongoStorage) GetStoredCdrs(qryFltr *utils.CdrsFilter) ([]*StoredCdr, int64, error) { +func (ms *MongoStorage) GetCDRs(qryFltr *utils.CDRsFilter) ([]*CDR, int64, error) { filters := bson.M{ - "cgrid": bson.M{"$in": qryFltr.CgrIds, "$nin": qryFltr.NotCgrIds}, - "mediationrunid": bson.M{"$in": qryFltr.RunIds, "$nin": qryFltr.NotRunIds}, - "tor": bson.M{"$in": qryFltr.Tors, "$nin": qryFltr.NotTors}, - "cdrhost": bson.M{"$in": qryFltr.CdrHosts, "$nin": qryFltr.NotCdrHosts}, - "cdrsource": bson.M{"$in": qryFltr.CdrSources, "$nin": qryFltr.NotCdrSources}, + "cgrid": bson.M{"$in": qryFltr.CGRIDs, "$nin": qryFltr.NotCGRIDs}, + "mediationrunid": bson.M{"$in": qryFltr.RunIDs, "$nin": qryFltr.NotRunIDs}, + "tor": bson.M{"$in": qryFltr.TORs, "$nin": qryFltr.NotTORs}, + "cdrhost": bson.M{"$in": qryFltr.OriginHosts, "$nin": qryFltr.NotOriginHosts}, + "cdrsource": bson.M{"$in": qryFltr.Sources, "$nin": qryFltr.NotSources}, "reqtype": bson.M{"$in": qryFltr.ReqTypes, "$nin": qryFltr.NotReqTypes}, "direction": bson.M{"$in": qryFltr.Directions, "$nin": qryFltr.NotDirections}, "tenant": bson.M{"$in": qryFltr.Tenants, "$nin": qryFltr.NotTenants}, @@ -779,9 +779,9 @@ func (ms *MongoStorage) GetStoredCdrs(qryFltr *utils.CdrsFilter) ([]*StoredCdr, "created_at": bson.M{"$gte": qryFltr.CreatedAtStart, "$lt": qryFltr.CreatedAtEnd}, "updated_at": bson.M{"$gte": qryFltr.UpdatedAtStart, "$lt": qryFltr.UpdatedAtEnd}, "usage": bson.M{"$gte": qryFltr.MinUsage, "$lt": qryFltr.MaxUsage}, - "pdd": bson.M{"$gte": qryFltr.MinPdd, "$lt": qryFltr.MaxPdd}, - "costdetails.account": bson.M{"$in": qryFltr.RatedAccounts, "$nin": qryFltr.NotRatedAccounts}, - "costdetails.subject": bson.M{"$in": qryFltr.RatedSubjects, "$nin": qryFltr.NotRatedSubjects}, + "pdd": bson.M{"$gte": qryFltr.MinPDD, "$lt": qryFltr.MaxPDD}, + "costdetails.account": bson.M{"$in": qryFltr.Accounts, "$nin": qryFltr.NotAccounts}, + "costdetails.subject": bson.M{"$in": qryFltr.Subjects, "$nin": qryFltr.NotSubjects}, } //file, _ := ioutil.TempFile(os.TempDir(), "debug") //file.WriteString(fmt.Sprintf("FILTER: %v\n", utils.ToIJSON(qryFltr))) @@ -799,16 +799,16 @@ func (ms *MongoStorage) GetStoredCdrs(qryFltr *utils.CdrsFilter) ([]*StoredCdr, } }*/ - if len(qryFltr.DestPrefixes) != 0 { + if len(qryFltr.DestinationPrefixes) != 0 { var regexes []bson.RegEx - for _, prefix := range qryFltr.DestPrefixes { + for _, prefix := range qryFltr.DestinationPrefixes { regexes = append(regexes, bson.RegEx{Pattern: regexp.QuoteMeta(prefix) + ".*"}) } filters["destination"] = bson.M{"$in": regexes} } - if len(qryFltr.NotDestPrefixes) != 0 { + if len(qryFltr.NotDestinationPrefixes) != 0 { var notRegexes []bson.RegEx - for _, prefix := range qryFltr.DestPrefixes { + for _, prefix := range qryFltr.NotDestinationPrefixes { notRegexes = append(notRegexes, bson.RegEx{Pattern: regexp.QuoteMeta(prefix) + ".*"}) } if m, ok := filters["destination"]; ok { @@ -870,8 +870,8 @@ func (ms *MongoStorage) GetStoredCdrs(qryFltr *utils.CdrsFilter) ([]*StoredCdr, // Execute query iter := q.Iter() - var cdrs []*StoredCdr - cdr := StoredCdr{} + var cdrs []*CDR + cdr := CDR{} for iter.Next(&cdr) { clone := cdr cdrs = append(cdrs, &clone) diff --git a/engine/storage_mysql_local_test.go b/engine/storage_mysql_local_test.go index 070c83127..738d04cc9 100644 --- a/engine/storage_mysql_local_test.go +++ b/engine/storage_mysql_local_test.go @@ -497,29 +497,29 @@ func TestMySQLSetCdr(t *testing.T) { t.Error(err.Error()) } } - strCdr1 := &StoredCdr{TOR: utils.VOICE, AccId: "bbb1", CdrHost: "192.168.1.1", CdrSource: "UNKNOWN", ReqType: utils.META_RATED, + strCdr1 := &CDR{TOR: utils.VOICE, OriginID: "bbb1", OriginHost: "192.168.1.1", Source: "UNKNOWN", ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002", SetupTime: time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC), AnswerTime: time.Date(2013, 12, 7, 8, 42, 26, 0, time.UTC), - Usage: time.Duration(10) * time.Second, Pdd: time.Duration(3) * time.Second, Supplier: "SUPPL1", - ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, - MediationRunId: utils.DEFAULT_RUNID, Cost: 1.201} - strCdr1.CgrId = utils.Sha1(strCdr1.AccId, strCdr1.SetupTime.String()) - strCdr2 := &StoredCdr{TOR: utils.VOICE, AccId: "bbb2", CdrHost: "192.168.1.2", CdrSource: "UNKNOWN2", ReqType: utils.META_PREPAID, + Usage: time.Duration(10) * time.Second, PDD: time.Duration(3) * time.Second, Supplier: "SUPPL1", + ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, + RunID: utils.DEFAULT_RUNID, Cost: 1.201} + strCdr1.CGRID = utils.Sha1(strCdr1.OriginID, strCdr1.SetupTime.String()) + strCdr2 := &CDR{TOR: utils.VOICE, OriginID: "bbb2", OriginHost: "192.168.1.2", Source: "UNKNOWN2", ReqType: utils.META_PREPAID, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002", SetupTime: time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC), AnswerTime: time.Date(2013, 12, 7, 8, 42, 26, 0, time.UTC), - Usage: time.Duration(12) * time.Second, Pdd: time.Duration(4) * time.Second, Supplier: "SUPPL1", - ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, - MediationRunId: utils.DEFAULT_RUNID, Cost: 0.201} - strCdr2.CgrId = utils.Sha1(strCdr2.AccId, strCdr2.SetupTime.String()) - strCdr3 := &StoredCdr{TOR: utils.VOICE, AccId: "bbb3", CdrHost: "192.168.1.1", CdrSource: utils.TEST_SQL, ReqType: utils.META_RATED, + Usage: time.Duration(12) * time.Second, PDD: time.Duration(4) * time.Second, Supplier: "SUPPL1", + ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, + RunID: utils.DEFAULT_RUNID, Cost: 0.201} + strCdr2.CGRID = utils.Sha1(strCdr2.OriginID, strCdr2.SetupTime.String()) + strCdr3 := &CDR{TOR: utils.VOICE, OriginID: "bbb3", OriginHost: "192.168.1.1", Source: utils.TEST_SQL, ReqType: utils.META_RATED, Direction: "*out", Tenant: "itsyscom.com", Category: "call", Account: "1002", Subject: "1000", Destination: "+4986517174963", SetupTime: time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC), AnswerTime: time.Date(2013, 12, 7, 8, 42, 26, 0, time.UTC), - Usage: time.Duration(10) * time.Second, Pdd: time.Duration(2) * time.Second, Supplier: "SUPPL1", - ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, - MediationRunId: utils.DEFAULT_RUNID, Cost: 1.201} - strCdr3.CgrId = utils.Sha1(strCdr3.AccId, strCdr3.SetupTime.String()) + Usage: time.Duration(10) * time.Second, PDD: time.Duration(2) * time.Second, Supplier: "SUPPL1", + ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, + RunID: utils.DEFAULT_RUNID, Cost: 1.201} + strCdr3.CGRID = utils.Sha1(strCdr3.OriginID, strCdr3.SetupTime.String()) - for _, cdr := range []*StoredCdr{strCdr1, strCdr2, strCdr3} { + for _, cdr := range []*CDR{strCdr1, strCdr2, strCdr3} { if err := mysqlDb.SetCdr(cdr); err != nil { t.Error(err.Error()) } @@ -530,29 +530,29 @@ func TestMySQLSetRatedCdr(t *testing.T) { if !*testLocal { return } - strCdr1 := &StoredCdr{TOR: utils.VOICE, AccId: "bbb1", CdrHost: "192.168.1.1", CdrSource: "UNKNOWN", ReqType: utils.META_RATED, + strCdr1 := &CDR{TOR: utils.VOICE, OriginID: "bbb1", OriginHost: "192.168.1.1", Source: "UNKNOWN", ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002", SetupTime: time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC), AnswerTime: time.Date(2013, 12, 7, 8, 42, 26, 0, time.UTC), - Usage: time.Duration(10) * time.Second, Pdd: time.Duration(3) * time.Second, Supplier: "SUPPL1", - ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, - MediationRunId: utils.DEFAULT_RUNID, Cost: 1.201} - strCdr1.CgrId = utils.Sha1(strCdr1.AccId, strCdr1.SetupTime.String()) - strCdr2 := &StoredCdr{TOR: utils.VOICE, AccId: "bbb2", CdrHost: "192.168.1.2", CdrSource: "UNKNOWN", ReqType: utils.META_PREPAID, + Usage: time.Duration(10) * time.Second, PDD: time.Duration(3) * time.Second, Supplier: "SUPPL1", + ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, + RunID: utils.DEFAULT_RUNID, Cost: 1.201} + strCdr1.CGRID = utils.Sha1(strCdr1.OriginID, strCdr1.SetupTime.String()) + strCdr2 := &CDR{TOR: utils.VOICE, OriginID: "bbb2", OriginHost: "192.168.1.2", Source: "UNKNOWN", ReqType: utils.META_PREPAID, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002", SetupTime: time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC), AnswerTime: time.Date(2013, 12, 7, 8, 42, 26, 0, time.UTC), - Usage: time.Duration(12) * time.Second, Pdd: time.Duration(7) * time.Second, Supplier: "SUPPL1", - ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, - MediationRunId: utils.DEFAULT_RUNID, Cost: 0.201} - strCdr2.CgrId = utils.Sha1(strCdr2.AccId, strCdr2.SetupTime.String()) - strCdr3 := &StoredCdr{TOR: utils.VOICE, AccId: "bbb3", CdrHost: "192.168.1.1", CdrSource: utils.TEST_SQL, ReqType: utils.META_RATED, + Usage: time.Duration(12) * time.Second, PDD: time.Duration(7) * time.Second, Supplier: "SUPPL1", + ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, + RunID: utils.DEFAULT_RUNID, Cost: 0.201} + strCdr2.CGRID = utils.Sha1(strCdr2.OriginID, strCdr2.SetupTime.String()) + strCdr3 := &CDR{TOR: utils.VOICE, OriginID: "bbb3", OriginHost: "192.168.1.1", Source: utils.TEST_SQL, ReqType: utils.META_RATED, Direction: "*out", Tenant: "itsyscom.com", Category: "call", Account: "1002", Subject: "1002", Destination: "+4986517174964", SetupTime: time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC), AnswerTime: time.Date(2013, 12, 7, 8, 42, 26, 0, time.UTC), - Usage: time.Duration(10) * time.Second, Pdd: time.Duration(2) * time.Second, Supplier: "SUPPL1", - ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, - MediationRunId: "wholesale_run", Cost: 1.201} - strCdr3.CgrId = utils.Sha1(strCdr3.AccId, strCdr3.SetupTime.String()) + Usage: time.Duration(10) * time.Second, PDD: time.Duration(2) * time.Second, Supplier: "SUPPL1", + ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, + RunID: "wholesale_run", Cost: 1.201} + strCdr3.CGRID = utils.Sha1(strCdr3.OriginID, strCdr3.SetupTime.String()) - for _, cdr := range []*StoredCdr{strCdr1, strCdr2, strCdr3} { + for _, cdr := range []*CDR{strCdr1, strCdr2, strCdr3} { if err := mysqlDb.SetRatedCdr(cdr); err != nil { t.Error(err.Error()) } @@ -563,7 +563,7 @@ func TestMySQLCallCost(t *testing.T) { if !*testLocal { return } - cgrId := utils.Sha1("bbb1", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()) + CGRID := utils.Sha1("bbb1", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()) cc := &CallCost{ Direction: "*out", Category: "call", @@ -583,39 +583,39 @@ func TestMySQLCallCost(t *testing.T) { }, }, } - if err := mysqlDb.LogCallCost(cgrId, utils.TEST_SQL, utils.DEFAULT_RUNID, cc); err != nil { + if err := mysqlDb.LogCallCost(CGRID, utils.TEST_SQL, utils.DEFAULT_RUNID, cc); err != nil { t.Error(err.Error()) } - if ccRcv, err := mysqlDb.GetCallCostLog(cgrId, utils.TEST_SQL, utils.DEFAULT_RUNID); err != nil { + if ccRcv, err := mysqlDb.GetCallCostLog(CGRID, utils.TEST_SQL, utils.DEFAULT_RUNID); err != nil { t.Error(err.Error()) } else if !reflect.DeepEqual(cc, ccRcv) { t.Errorf("Expecting call cost: %v, received: %v", cc, ccRcv) } // UPDATE test here cc.Category = "premium_call" - if err := mysqlDb.LogCallCost(cgrId, utils.TEST_SQL, utils.DEFAULT_RUNID, cc); err != nil { + if err := mysqlDb.LogCallCost(CGRID, utils.TEST_SQL, utils.DEFAULT_RUNID, cc); err != nil { t.Error(err.Error()) } - if ccRcv, err := mysqlDb.GetCallCostLog(cgrId, utils.TEST_SQL, utils.DEFAULT_RUNID); err != nil { + if ccRcv, err := mysqlDb.GetCallCostLog(CGRID, utils.TEST_SQL, utils.DEFAULT_RUNID); err != nil { t.Error(err.Error()) } else if !reflect.DeepEqual(cc, ccRcv) { t.Errorf("Expecting call cost: %v, received: %v", cc, ccRcv) } } -func TestMySQLGetStoredCdrs(t *testing.T) { +func TestMySQLGetCDRs(t *testing.T) { if !*testLocal { return } var timeStart, timeEnd time.Time // All CDRs, no filter - if storedCdrs, _, err := mysqlDb.GetStoredCdrs(new(utils.CdrsFilter)); err != nil { + if storedCdrs, _, err := mysqlDb.GetCDRs(new(utils.CDRsFilter)); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 8 { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) } // Count ALL - if storedCdrs, count, err := mysqlDb.GetStoredCdrs(&utils.CdrsFilter{Count: true}); err != nil { + if storedCdrs, count, err := mysqlDb.GetCDRs(&utils.CDRsFilter{Count: true}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 0 { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) @@ -623,287 +623,275 @@ func TestMySQLGetStoredCdrs(t *testing.T) { t.Error("Unexpected count of StoredCdrs returned: ", count) } // Limit 5 - if storedCdrs, _, err := mysqlDb.GetStoredCdrs(&utils.CdrsFilter{Paginator: utils.Paginator{Limit: utils.IntPointer(5), Offset: utils.IntPointer(0)}}); err != nil { + if storedCdrs, _, err := mysqlDb.GetCDRs(&utils.CDRsFilter{Paginator: utils.Paginator{Limit: utils.IntPointer(5), Offset: utils.IntPointer(0)}}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 5 { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) } // Offset 5 - if storedCdrs, _, err := mysqlDb.GetStoredCdrs(&utils.CdrsFilter{Paginator: utils.Paginator{Limit: utils.IntPointer(5), Offset: utils.IntPointer(0)}}); err != nil { + if storedCdrs, _, err := mysqlDb.GetCDRs(&utils.CDRsFilter{Paginator: utils.Paginator{Limit: utils.IntPointer(5), Offset: utils.IntPointer(0)}}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 5 { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) } // Offset with limit 2 - if storedCdrs, _, err := mysqlDb.GetStoredCdrs(&utils.CdrsFilter{Paginator: utils.Paginator{Limit: utils.IntPointer(2), Offset: utils.IntPointer(5)}}); err != nil { + if storedCdrs, _, err := mysqlDb.GetCDRs(&utils.CDRsFilter{Paginator: utils.Paginator{Limit: utils.IntPointer(2), Offset: utils.IntPointer(5)}}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 2 { t.Error("Unexpected number of StoredCdrs returned: ", len(storedCdrs)) } - // Filter on cgrids - if storedCdrs, _, err := mysqlDb.GetStoredCdrs(&utils.CdrsFilter{CgrIds: []string{utils.Sha1("bbb1", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()), + // Filter on CGRIDs + if storedCdrs, _, err := mysqlDb.GetCDRs(&utils.CDRsFilter{CGRIDs: []string{utils.Sha1("bbb1", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()), utils.Sha1("bbb2", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String())}}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 2 { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) } // Count on CGRIDS - if _, count, err := mysqlDb.GetStoredCdrs(&utils.CdrsFilter{CgrIds: []string{utils.Sha1("bbb1", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()), + if _, count, err := mysqlDb.GetCDRs(&utils.CDRsFilter{CGRIDs: []string{utils.Sha1("bbb1", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()), utils.Sha1("bbb2", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String())}, Count: true}); err != nil { t.Error(err.Error()) } else if count != 2 { t.Error("Unexpected count of StoredCdrs returned: ", count) } - // Filter on cgrids plus reqType - if storedCdrs, _, err := mysqlDb.GetStoredCdrs(&utils.CdrsFilter{CgrIds: []string{utils.Sha1("bbb1", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()), + // Filter on CGRIDs plus reqType + if storedCdrs, _, err := mysqlDb.GetCDRs(&utils.CDRsFilter{CGRIDs: []string{utils.Sha1("bbb1", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()), utils.Sha1("bbb2", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String())}, ReqTypes: []string{utils.META_PREPAID}}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 1 { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) } // Count on multiple filter - if _, count, err := mysqlDb.GetStoredCdrs(&utils.CdrsFilter{CgrIds: []string{utils.Sha1("bbb1", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()), + if _, count, err := mysqlDb.GetCDRs(&utils.CDRsFilter{CGRIDs: []string{utils.Sha1("bbb1", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()), utils.Sha1("bbb2", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String())}, ReqTypes: []string{utils.META_PREPAID}, Count: true}); err != nil { t.Error(err.Error()) } else if count != 1 { t.Error("Unexpected count of StoredCdrs returned: ", count) } // Filter on runId - if storedCdrs, _, err := mysqlDb.GetStoredCdrs(&utils.CdrsFilter{RunIds: []string{utils.DEFAULT_RUNID}}); err != nil { + if storedCdrs, _, err := mysqlDb.GetCDRs(&utils.CDRsFilter{RunIDs: []string{utils.DEFAULT_RUNID}}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 2 { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) } // Filter on TOR - if storedCdrs, _, err := mysqlDb.GetStoredCdrs(&utils.CdrsFilter{Tors: []string{utils.SMS}}); err != nil { + if storedCdrs, _, err := mysqlDb.GetCDRs(&utils.CDRsFilter{TORs: []string{utils.SMS}}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 0 { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) } // Filter on multiple TOR - if storedCdrs, _, err := mysqlDb.GetStoredCdrs(&utils.CdrsFilter{Tors: []string{utils.SMS, utils.VOICE}}); err != nil { + if storedCdrs, _, err := mysqlDb.GetCDRs(&utils.CDRsFilter{TORs: []string{utils.SMS, utils.VOICE}}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 8 { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) } - // Filter on cdrHost - if storedCdrs, _, err := mysqlDb.GetStoredCdrs(&utils.CdrsFilter{CdrHosts: []string{"192.168.1.2"}}); err != nil { + // Filter on OriginHost + if storedCdrs, _, err := mysqlDb.GetCDRs(&utils.CDRsFilter{OriginHosts: []string{"192.168.1.2"}}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 3 { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) } - // Filter on multiple cdrHost - if storedCdrs, _, err := mysqlDb.GetStoredCdrs(&utils.CdrsFilter{CdrHosts: []string{"192.168.1.1", "192.168.1.2"}}); err != nil { + // Filter on multiple OriginHost + if storedCdrs, _, err := mysqlDb.GetCDRs(&utils.CDRsFilter{OriginHosts: []string{"192.168.1.1", "192.168.1.2"}}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 8 { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) } - // Filter on cdrSource - if storedCdrs, _, err := mysqlDb.GetStoredCdrs(&utils.CdrsFilter{CdrSources: []string{"UNKNOWN"}}); err != nil { + // Filter on Source + if storedCdrs, _, err := mysqlDb.GetCDRs(&utils.CDRsFilter{Sources: []string{"UNKNOWN"}}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 1 { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) } - // Filter on multiple cdrSource - if storedCdrs, _, err := mysqlDb.GetStoredCdrs(&utils.CdrsFilter{CdrSources: []string{"UNKNOWN", "UNKNOWN2"}}); err != nil { + // Filter on multiple Source + if storedCdrs, _, err := mysqlDb.GetCDRs(&utils.CDRsFilter{Sources: []string{"UNKNOWN", "UNKNOWN2"}}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 2 { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) } // Filter on reqType - if storedCdrs, _, err := mysqlDb.GetStoredCdrs(&utils.CdrsFilter{ReqTypes: []string{utils.META_PREPAID}}); err != nil { + if storedCdrs, _, err := mysqlDb.GetCDRs(&utils.CDRsFilter{ReqTypes: []string{utils.META_PREPAID}}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 2 { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) } // Filter on multiple reqType - if storedCdrs, _, err := mysqlDb.GetStoredCdrs(&utils.CdrsFilter{ReqTypes: []string{utils.META_PREPAID, utils.META_PSEUDOPREPAID}}); err != nil { + if storedCdrs, _, err := mysqlDb.GetCDRs(&utils.CDRsFilter{ReqTypes: []string{utils.META_PREPAID, utils.META_PSEUDOPREPAID}}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 3 { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) } // Filter on direction - if storedCdrs, _, err := mysqlDb.GetStoredCdrs(&utils.CdrsFilter{Directions: []string{"*out"}}); err != nil { + if storedCdrs, _, err := mysqlDb.GetCDRs(&utils.CDRsFilter{Directions: []string{"*out"}}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 8 { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) } // Filter on tenant - if storedCdrs, _, err := mysqlDb.GetStoredCdrs(&utils.CdrsFilter{Tenants: []string{"itsyscom.com"}}); err != nil { + if storedCdrs, _, err := mysqlDb.GetCDRs(&utils.CDRsFilter{Tenants: []string{"itsyscom.com"}}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 3 { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) } // Filter on multiple tenants - if storedCdrs, _, err := mysqlDb.GetStoredCdrs(&utils.CdrsFilter{Tenants: []string{"itsyscom.com", "cgrates.org"}}); err != nil { + if storedCdrs, _, err := mysqlDb.GetCDRs(&utils.CDRsFilter{Tenants: []string{"itsyscom.com", "cgrates.org"}}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 8 { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) } // Filter on category - if storedCdrs, _, err := mysqlDb.GetStoredCdrs(&utils.CdrsFilter{Categories: []string{"premium_call"}}); err != nil { + if storedCdrs, _, err := mysqlDb.GetCDRs(&utils.CDRsFilter{Categories: []string{"premium_call"}}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 1 { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) } // Filter on multiple categories - if storedCdrs, _, err := mysqlDb.GetStoredCdrs(&utils.CdrsFilter{Categories: []string{"premium_call", "call"}}); err != nil { + if storedCdrs, _, err := mysqlDb.GetCDRs(&utils.CDRsFilter{Categories: []string{"premium_call", "call"}}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 8 { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) } // Filter on account - if storedCdrs, _, err := mysqlDb.GetStoredCdrs(&utils.CdrsFilter{Accounts: []string{"1002"}}); err != nil { + if storedCdrs, _, err := mysqlDb.GetCDRs(&utils.CDRsFilter{Accounts: []string{"1002"}}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 3 { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) } // Filter on multiple account - if storedCdrs, _, err := mysqlDb.GetStoredCdrs(&utils.CdrsFilter{Accounts: []string{"1001", "1002"}}); err != nil { + if storedCdrs, _, err := mysqlDb.GetCDRs(&utils.CDRsFilter{Accounts: []string{"1001", "1002"}}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 8 { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) } // Filter on subject - if storedCdrs, _, err := mysqlDb.GetStoredCdrs(&utils.CdrsFilter{Subjects: []string{"1000"}}); err != nil { + if storedCdrs, _, err := mysqlDb.GetCDRs(&utils.CDRsFilter{Subjects: []string{"1000"}}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 1 { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) } // Filter on multiple subject - if storedCdrs, _, err := mysqlDb.GetStoredCdrs(&utils.CdrsFilter{Subjects: []string{"1000", "1002"}}); err != nil { + if storedCdrs, _, err := mysqlDb.GetCDRs(&utils.CDRsFilter{Subjects: []string{"1000", "1002"}}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 3 { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) } // Filter on destPrefix - if storedCdrs, _, err := mysqlDb.GetStoredCdrs(&utils.CdrsFilter{DestPrefixes: []string{"+498651"}}); err != nil { + if storedCdrs, _, err := mysqlDb.GetCDRs(&utils.CDRsFilter{DestinationPrefixes: []string{"+498651"}}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 3 { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) } - // Filter on multiple destPrefixes - if storedCdrs, _, err := mysqlDb.GetStoredCdrs(&utils.CdrsFilter{DestPrefixes: []string{"1001", "+498651"}}); err != nil { + // Filter on multiple DestinationPrefixes + if storedCdrs, _, err := mysqlDb.GetCDRs(&utils.CDRsFilter{DestinationPrefixes: []string{"1001", "+498651"}}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 4 { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) } - // Filter on ratedAccount - if storedCdrs, _, err := mysqlDb.GetStoredCdrs(&utils.CdrsFilter{RatedAccounts: []string{"8001"}}); err != nil { - t.Error(err.Error()) - } else if len(storedCdrs) != 1 { - t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) - } - // Filter on ratedSubject - if storedCdrs, _, err := mysqlDb.GetStoredCdrs(&utils.CdrsFilter{RatedSubjects: []string{"91001"}}); err != nil { - t.Error(err.Error()) - } else if len(storedCdrs) != 1 { - t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) - } // Filter on ignoreRated - var orderIdStart, orderIdEnd int64 // Capture also orderIds for the next test - if storedCdrs, _, err := mysqlDb.GetStoredCdrs(&utils.CdrsFilter{MaxCost: utils.Float64Pointer(0.0)}); err != nil { + var OrderIDStart, OrderIDEnd int64 // Capture also orderIds for the next test + if storedCdrs, _, err := mysqlDb.GetCDRs(&utils.CDRsFilter{MaxCost: utils.Float64Pointer(0.0)}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 5 { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) } else { for _, cdr := range storedCdrs { - if cdr.OrderId < orderIdStart { - orderIdStart = cdr.OrderId + if cdr.OrderID < OrderIDStart { + OrderIDStart = cdr.OrderID } - if cdr.OrderId > orderIdEnd { - orderIdEnd = cdr.OrderId + if cdr.OrderID > OrderIDEnd { + OrderIDEnd = cdr.OrderID } } } - // Filter on orderIdStart - if storedCdrs, _, err := mysqlDb.GetStoredCdrs(&utils.CdrsFilter{OrderIdStart: orderIdStart}); err != nil { + // Filter on OrderIDStart + if storedCdrs, _, err := mysqlDb.GetCDRs(&utils.CDRsFilter{OrderIDStart: OrderIDStart}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 8 { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) } - // Filter on orderIdStart and orderIdEnd - if storedCdrs, _, err := mysqlDb.GetStoredCdrs(&utils.CdrsFilter{OrderIdStart: orderIdStart, OrderIdEnd: orderIdEnd}); err != nil { + // Filter on OrderIDStart and OrderIDEnd + if storedCdrs, _, err := mysqlDb.GetCDRs(&utils.CDRsFilter{OrderIDStart: OrderIDStart, OrderIDEnd: OrderIDEnd}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 4 { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) } // Filter on timeStart timeStart = time.Date(2013, 11, 8, 8, 0, 0, 0, time.UTC) - if storedCdrs, _, err := mysqlDb.GetStoredCdrs(&utils.CdrsFilter{AnswerTimeStart: &timeStart}); err != nil { + if storedCdrs, _, err := mysqlDb.GetCDRs(&utils.CDRsFilter{AnswerTimeStart: &timeStart}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 5 { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) } // Filter on timeStart and timeEnd timeEnd = time.Date(2013, 12, 1, 8, 0, 0, 0, time.UTC) - if storedCdrs, _, err := mysqlDb.GetStoredCdrs(&utils.CdrsFilter{AnswerTimeStart: &timeStart, AnswerTimeEnd: &timeEnd}); err != nil { + if storedCdrs, _, err := mysqlDb.GetCDRs(&utils.CDRsFilter{AnswerTimeStart: &timeStart, AnswerTimeEnd: &timeEnd}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 2 { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) } - // Filter on minPdd - if storedCdrs, _, err := mysqlDb.GetStoredCdrs(&utils.CdrsFilter{MinPdd: utils.Float64Pointer(3)}); err != nil { + // Filter on minPDD + if storedCdrs, _, err := mysqlDb.GetCDRs(&utils.CDRsFilter{MinPDD: utils.Float64Pointer(3)}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 7 { t.Error("Unexpected number of StoredCdrs returned: ", len(storedCdrs)) } - // Filter on maxPdd - if storedCdrs, _, err := mysqlDb.GetStoredCdrs(&utils.CdrsFilter{MaxPdd: utils.Float64Pointer(3)}); err != nil { + // Filter on maxPDD + if storedCdrs, _, err := mysqlDb.GetCDRs(&utils.CDRsFilter{MaxPDD: utils.Float64Pointer(3)}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 1 { t.Error("Unexpected number of StoredCdrs returned: ", len(storedCdrs)) } - // Filter on minPdd, maxPdd - if storedCdrs, _, err := mysqlDb.GetStoredCdrs(&utils.CdrsFilter{MinPdd: utils.Float64Pointer(3), MaxPdd: utils.Float64Pointer(5)}); err != nil { + // Filter on minPDD, maxPDD + if storedCdrs, _, err := mysqlDb.GetCDRs(&utils.CDRsFilter{MinPDD: utils.Float64Pointer(3), MaxPDD: utils.Float64Pointer(5)}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 5 { t.Error("Unexpected number of StoredCdrs returned: ", len(storedCdrs)) } // Combined filter - if storedCdrs, _, err := mysqlDb.GetStoredCdrs(&utils.CdrsFilter{ReqTypes: []string{utils.META_RATED}, AnswerTimeStart: &timeStart, AnswerTimeEnd: &timeEnd}); err != nil { + if storedCdrs, _, err := mysqlDb.GetCDRs(&utils.CDRsFilter{ReqTypes: []string{utils.META_RATED}, AnswerTimeStart: &timeStart, AnswerTimeEnd: &timeEnd}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 1 { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) } // Filter on ignoreDerived - if storedCdrs, _, err := mysqlDb.GetStoredCdrs(&utils.CdrsFilter{AnswerTimeStart: &timeStart, AnswerTimeEnd: &timeEnd, FilterOnRated: true}); err != nil { + if storedCdrs, _, err := mysqlDb.GetCDRs(&utils.CDRsFilter{AnswerTimeStart: &timeStart, AnswerTimeEnd: &timeEnd, FilterOnRated: true}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 0 { // ToDo: Recheck this value t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) } } -func TestMySQLRemStoredCdrs(t *testing.T) { +func TestMySQLRemCDRs(t *testing.T) { if !*testLocal { return } - cgrIdB1 := utils.Sha1("bbb1", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()) - if err := mysqlDb.RemStoredCdrs([]string{cgrIdB1}); err != nil { + CGRIDB1 := utils.Sha1("bbb1", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()) + if err := mysqlDb.RemCDRs([]string{CGRIDB1}); err != nil { t.Error(err.Error()) } - if storedCdrs, _, err := mysqlDb.GetStoredCdrs(new(utils.CdrsFilter)); err != nil { + if storedCdrs, _, err := mysqlDb.GetCDRs(new(utils.CDRsFilter)); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 7 { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) } tm, _ := utils.ParseTimeDetectLayout("2013-11-08T08:42:20Z", "") - cgrIdA1 := utils.Sha1("aaa1", tm.String()) + CGRIDA1 := utils.Sha1("aaa1", tm.String()) tm, _ = utils.ParseTimeDetectLayout("2013-11-08T08:42:22Z", "") - cgrIdA2 := utils.Sha1("aaa2", tm.String()) + CGRIDA2 := utils.Sha1("aaa2", tm.String()) tm, _ = utils.ParseTimeDetectLayout("2013-11-07T08:42:24Z", "") - cgrIdA3 := utils.Sha1("aaa3", tm.String()) + CGRIDA3 := utils.Sha1("aaa3", tm.String()) tm, _ = utils.ParseTimeDetectLayout("2013-11-07T08:42:21Z", "") - cgrIdA4 := utils.Sha1("aaa4", tm.String()) + CGRIDA4 := utils.Sha1("aaa4", tm.String()) tm, _ = utils.ParseTimeDetectLayout("2013-11-07T08:42:25Z", "") - cgrIdA5 := utils.Sha1("aaa5", tm.String()) - cgrIdB2 := utils.Sha1("bbb2", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()) - cgrIdB3 := utils.Sha1("bbb3", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()) - if err := mysqlDb.RemStoredCdrs([]string{cgrIdA1, cgrIdA2, cgrIdA3, cgrIdA4, cgrIdA5, - cgrIdB2, cgrIdB3}); err != nil { + CGRIDA5 := utils.Sha1("aaa5", tm.String()) + CGRIDB2 := utils.Sha1("bbb2", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()) + CGRIDB3 := utils.Sha1("bbb3", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()) + if err := mysqlDb.RemCDRs([]string{CGRIDA1, CGRIDA2, CGRIDA3, CGRIDA4, CGRIDA5, + CGRIDB2, CGRIDB3}); err != nil { t.Error(err.Error()) } - if storedCdrs, _, err := mysqlDb.GetStoredCdrs(new(utils.CdrsFilter)); err != nil { + if storedCdrs, _, err := mysqlDb.GetCDRs(new(utils.CDRsFilter)); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 0 { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) @@ -915,13 +903,13 @@ func TestMySQLStoreRestoreCdr(t *testing.T) { if !*testLocal { return } - strCdr := &StoredCdr{TOR: utils.VOICE, AccId: "ccc1", CdrHost: "192.168.1.1", CdrSource: "TEST_CDR", ReqType: utils.META_RATED, + strCdr := &CDR{TOR: utils.VOICE, OriginID: "ccc1", OriginHost: "192.168.1.1", Source: "TEST_CDR", ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002", SetupTime: time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC), AnswerTime: time.Date(2013, 12, 7, 8, 42, 26, 0, time.UTC), - Usage: time.Duration(10) * time.Second, Pdd: time.Duration(3) * time.Second, Supplier: "SUPPL1", - ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, - MediationRunId: utils.DEFAULT_RUNID, Cost: 1.201} - strCdr.CgrId = utils.Sha1(strCdr.AccId, strCdr.SetupTime.String()) + Usage: time.Duration(10) * time.Second, PDD: time.Duration(3) * time.Second, Supplier: "SUPPL1", + ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, + RunID: utils.DEFAULT_RUNID, Cost: 1.201} + strCdr.CGRID = utils.Sha1(strCdr.OriginID, strCdr.SetupTime.String()) if err := mysqlDb.SetCdr(strCdr); err != nil { t.Error(err.Error()) } @@ -929,16 +917,16 @@ func TestMySQLStoreRestoreCdr(t *testing.T) { t.Error(err.Error()) } // Check RawCdr - if rcvCdrs, _, err := mysqlDb.GetStoredCdrs(&utils.CdrsFilter{CgrIds: []string{strCdr.CgrId}}); err != nil { + if rcvCdrs, _, err := mysqlDb.GetCDRs(&utils.CDRsFilter{CGRIDs: []string{strCdr.CGRID}}); err != nil { t.Error(err.Error()) } else if len(rcvCdrs) != 1 { t.Errorf("Unexpected cdrs returned: %+v", rcvCdrs) } else { rcvCdr := rcvCdrs[0] - if strCdr.CgrId != rcvCdr.CgrId || + if strCdr.CGRID != rcvCdr.CGRID || strCdr.TOR != rcvCdr.TOR || - strCdr.AccId != rcvCdr.AccId || - strCdr.CdrHost != rcvCdr.CdrHost || + strCdr.OriginID != rcvCdr.OriginID || + strCdr.OriginHost != rcvCdr.OriginHost || strCdr.ReqType != rcvCdr.ReqType || strCdr.Direction != rcvCdr.Direction || strCdr.Tenant != rcvCdr.Tenant || @@ -949,7 +937,7 @@ func TestMySQLStoreRestoreCdr(t *testing.T) { !strCdr.SetupTime.Equal(rcvCdr.SetupTime) || !strCdr.AnswerTime.Equal(rcvCdr.AnswerTime) || strCdr.Usage != rcvCdr.Usage || - strCdr.Pdd != rcvCdr.Pdd || + strCdr.PDD != rcvCdr.PDD || strCdr.Supplier != rcvCdr.Supplier || strCdr.DisconnectCause != rcvCdr.DisconnectCause || !reflect.DeepEqual(strCdr.ExtraFields, rcvCdr.ExtraFields) { @@ -957,16 +945,16 @@ func TestMySQLStoreRestoreCdr(t *testing.T) { } } // Check RatedCdr - if rcvCdrs, _, err := mysqlDb.GetStoredCdrs(&utils.CdrsFilter{CgrIds: []string{strCdr.CgrId}, FilterOnRated: true}); err != nil { + if rcvCdrs, _, err := mysqlDb.GetCDRs(&utils.CDRsFilter{CGRIDs: []string{strCdr.CGRID}, FilterOnRated: true}); err != nil { t.Error(err.Error()) } else if len(rcvCdrs) != 1 { t.Errorf("Unexpected cdrs returned: %+v", rcvCdrs) } else { rcvCdr := rcvCdrs[0] - if strCdr.CgrId != rcvCdr.CgrId || + if strCdr.CGRID != rcvCdr.CGRID || strCdr.TOR != rcvCdr.TOR || - strCdr.AccId != rcvCdr.AccId || - strCdr.CdrHost != rcvCdr.CdrHost || + strCdr.OriginID != rcvCdr.OriginID || + strCdr.OriginHost != rcvCdr.OriginHost || strCdr.ReqType != rcvCdr.ReqType || strCdr.Direction != rcvCdr.Direction || strCdr.Tenant != rcvCdr.Tenant || @@ -977,7 +965,7 @@ func TestMySQLStoreRestoreCdr(t *testing.T) { //!strCdr.SetupTime.Equal(rcvCdr.SetupTime) || // FixMe //!strCdr.AnswerTime.Equal(rcvCdr.AnswerTime) || // FixMe strCdr.Usage != rcvCdr.Usage || - strCdr.Pdd != rcvCdr.Pdd || + strCdr.PDD != rcvCdr.PDD || strCdr.Supplier != rcvCdr.Supplier || strCdr.DisconnectCause != rcvCdr.DisconnectCause || strCdr.Cost != rcvCdr.Cost || diff --git a/engine/storage_psql_local_test.go b/engine/storage_psql_local_test.go index c2a58411f..01e663624 100644 --- a/engine/storage_psql_local_test.go +++ b/engine/storage_psql_local_test.go @@ -492,29 +492,29 @@ func TestPSQLSetCdr(t *testing.T) { t.Error(err.Error()) } } - strCdr1 := &StoredCdr{TOR: utils.VOICE, AccId: "bbb1", CdrHost: "192.168.1.1", CdrSource: "UNKNOWN", ReqType: utils.META_RATED, + strCdr1 := &CDR{TOR: utils.VOICE, OriginID: "bbb1", OriginHost: "192.168.1.1", Source: "UNKNOWN", ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002", SetupTime: time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC), AnswerTime: time.Date(2013, 12, 7, 8, 42, 26, 0, time.UTC), - Usage: time.Duration(10) * time.Second, Pdd: time.Duration(3) * time.Second, Supplier: "SUPPL1", - ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, - MediationRunId: utils.DEFAULT_RUNID, Cost: 1.201} - strCdr1.CgrId = utils.Sha1(strCdr1.AccId, strCdr1.SetupTime.String()) - strCdr2 := &StoredCdr{TOR: utils.VOICE, AccId: "bbb2", CdrHost: "192.168.1.2", CdrSource: "UNKNOWN2", ReqType: utils.META_PREPAID, + Usage: time.Duration(10) * time.Second, PDD: time.Duration(3) * time.Second, Supplier: "SUPPL1", + ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, + RunID: utils.DEFAULT_RUNID, Cost: 1.201} + strCdr1.CGRID = utils.Sha1(strCdr1.OriginID, strCdr1.SetupTime.String()) + strCdr2 := &CDR{TOR: utils.VOICE, OriginID: "bbb2", OriginHost: "192.168.1.2", Source: "UNKNOWN2", ReqType: utils.META_PREPAID, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002", SetupTime: time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC), AnswerTime: time.Date(2013, 12, 7, 8, 42, 26, 0, time.UTC), - Usage: time.Duration(12) * time.Second, Pdd: time.Duration(4) * time.Second, Supplier: "SUPPL1", - ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, - MediationRunId: utils.DEFAULT_RUNID, Cost: 0.201} - strCdr2.CgrId = utils.Sha1(strCdr2.AccId, strCdr2.SetupTime.String()) - strCdr3 := &StoredCdr{TOR: utils.VOICE, AccId: "bbb3", CdrHost: "192.168.1.1", CdrSource: utils.TEST_SQL, ReqType: utils.META_RATED, + Usage: time.Duration(12) * time.Second, PDD: time.Duration(4) * time.Second, Supplier: "SUPPL1", + ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, + RunID: utils.DEFAULT_RUNID, Cost: 0.201} + strCdr2.CGRID = utils.Sha1(strCdr2.OriginID, strCdr2.SetupTime.String()) + strCdr3 := &CDR{TOR: utils.VOICE, OriginID: "bbb3", OriginHost: "192.168.1.1", Source: utils.TEST_SQL, ReqType: utils.META_RATED, Direction: "*out", Tenant: "itsyscom.com", Category: "call", Account: "1002", Subject: "1000", Destination: "+4986517174963", SetupTime: time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC), AnswerTime: time.Date(2013, 12, 7, 8, 42, 26, 0, time.UTC), - Usage: time.Duration(10) * time.Second, Pdd: time.Duration(2) * time.Second, Supplier: "SUPPL1", - ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, - MediationRunId: utils.DEFAULT_RUNID, Cost: 1.201} - strCdr3.CgrId = utils.Sha1(strCdr3.AccId, strCdr3.SetupTime.String()) + Usage: time.Duration(10) * time.Second, PDD: time.Duration(2) * time.Second, Supplier: "SUPPL1", + ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, + RunID: utils.DEFAULT_RUNID, Cost: 1.201} + strCdr3.CGRID = utils.Sha1(strCdr3.OriginID, strCdr3.SetupTime.String()) - for _, cdr := range []*StoredCdr{strCdr1, strCdr2, strCdr3} { + for _, cdr := range []*CDR{strCdr1, strCdr2, strCdr3} { if err := psqlDb.SetCdr(cdr); err != nil { t.Error(err.Error()) } @@ -525,7 +525,7 @@ func TestPSQLCallCost(t *testing.T) { if !*testLocal { return } - cgrId := utils.Sha1("bbb1", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()) + CGRID := utils.Sha1("bbb1", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()) cc := &CallCost{ Direction: "*out", Category: "call", @@ -545,20 +545,20 @@ func TestPSQLCallCost(t *testing.T) { }, }, } - if err := psqlDb.LogCallCost(cgrId, utils.TEST_SQL, utils.DEFAULT_RUNID, cc); err != nil { + if err := psqlDb.LogCallCost(CGRID, utils.TEST_SQL, utils.DEFAULT_RUNID, cc); err != nil { t.Error(err.Error()) } - if ccRcv, err := psqlDb.GetCallCostLog(cgrId, utils.TEST_SQL, utils.DEFAULT_RUNID); err != nil { + if ccRcv, err := psqlDb.GetCallCostLog(CGRID, utils.TEST_SQL, utils.DEFAULT_RUNID); err != nil { t.Error(err.Error()) } else if !reflect.DeepEqual(cc, ccRcv) { t.Errorf("Expecting call cost: %v, received: %v", cc, ccRcv) } // UPDATE test here cc.Category = "premium_call" - if err := psqlDb.LogCallCost(cgrId, utils.TEST_SQL, utils.DEFAULT_RUNID, cc); err != nil { + if err := psqlDb.LogCallCost(CGRID, utils.TEST_SQL, utils.DEFAULT_RUNID, cc); err != nil { t.Error(err.Error()) } - if ccRcv, err := psqlDb.GetCallCostLog(cgrId, utils.TEST_SQL, utils.DEFAULT_RUNID); err != nil { + if ccRcv, err := psqlDb.GetCallCostLog(CGRID, utils.TEST_SQL, utils.DEFAULT_RUNID); err != nil { t.Error(err.Error()) } else if !reflect.DeepEqual(cc, ccRcv) { t.Errorf("Expecting call cost: %v, received: %v", cc, ccRcv) @@ -569,48 +569,48 @@ func TestPSQLSetRatedCdr(t *testing.T) { if !*testLocal { return } - strCdr1 := &StoredCdr{TOR: utils.VOICE, AccId: "bbb1", CdrHost: "192.168.1.1", CdrSource: "UNKNOWN", ReqType: utils.META_RATED, + strCdr1 := &CDR{TOR: utils.VOICE, OriginID: "bbb1", OriginHost: "192.168.1.1", Source: "UNKNOWN", ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002", SetupTime: time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC), AnswerTime: time.Date(2013, 12, 7, 8, 42, 26, 0, time.UTC), - Usage: time.Duration(10) * time.Second, Pdd: time.Duration(3) * time.Second, Supplier: "SUPPL1", - ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, - MediationRunId: utils.DEFAULT_RUNID, Cost: 1.201} - strCdr1.CgrId = utils.Sha1(strCdr1.AccId, strCdr1.SetupTime.String()) - strCdr2 := &StoredCdr{TOR: utils.VOICE, AccId: "bbb2", CdrHost: "192.168.1.2", CdrSource: "UNKNOWN", ReqType: utils.META_PREPAID, + Usage: time.Duration(10) * time.Second, PDD: time.Duration(3) * time.Second, Supplier: "SUPPL1", + ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, + RunID: utils.DEFAULT_RUNID, Cost: 1.201} + strCdr1.CGRID = utils.Sha1(strCdr1.OriginID, strCdr1.SetupTime.String()) + strCdr2 := &CDR{TOR: utils.VOICE, OriginID: "bbb2", OriginHost: "192.168.1.2", Source: "UNKNOWN", ReqType: utils.META_PREPAID, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002", SetupTime: time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC), AnswerTime: time.Date(2013, 12, 7, 8, 42, 26, 0, time.UTC), - Usage: time.Duration(12) * time.Second, Pdd: time.Duration(7) * time.Second, Supplier: "SUPPL1", - ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, - MediationRunId: utils.DEFAULT_RUNID, Cost: 0.201} - strCdr2.CgrId = utils.Sha1(strCdr2.AccId, strCdr2.SetupTime.String()) - strCdr3 := &StoredCdr{TOR: utils.VOICE, AccId: "bbb3", CdrHost: "192.168.1.1", CdrSource: utils.TEST_SQL, ReqType: utils.META_RATED, + Usage: time.Duration(12) * time.Second, PDD: time.Duration(7) * time.Second, Supplier: "SUPPL1", + ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, + RunID: utils.DEFAULT_RUNID, Cost: 0.201} + strCdr2.CGRID = utils.Sha1(strCdr2.OriginID, strCdr2.SetupTime.String()) + strCdr3 := &CDR{TOR: utils.VOICE, OriginID: "bbb3", OriginHost: "192.168.1.1", Source: utils.TEST_SQL, ReqType: utils.META_RATED, Direction: "*out", Tenant: "itsyscom.com", Category: "call", Account: "1002", Subject: "1002", Destination: "+4986517174964", SetupTime: time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC), AnswerTime: time.Date(2013, 12, 7, 8, 42, 26, 0, time.UTC), - Usage: time.Duration(10) * time.Second, Pdd: time.Duration(2) * time.Second, Supplier: "SUPPL1", - ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, - MediationRunId: "wholesale_run", Cost: 1.201} - strCdr3.CgrId = utils.Sha1(strCdr3.AccId, strCdr3.SetupTime.String()) + Usage: time.Duration(10) * time.Second, PDD: time.Duration(2) * time.Second, Supplier: "SUPPL1", + ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, + RunID: "wholesale_run", Cost: 1.201} + strCdr3.CGRID = utils.Sha1(strCdr3.OriginID, strCdr3.SetupTime.String()) - for _, cdr := range []*StoredCdr{strCdr1, strCdr2, strCdr3} { + for _, cdr := range []*CDR{strCdr1, strCdr2, strCdr3} { if err := psqlDb.SetRatedCdr(cdr); err != nil { t.Error(err.Error()) } } } -func TestPSQLGetStoredCdrs(t *testing.T) { +func TestPSQLGetCDRs(t *testing.T) { if !*testLocal { return } var timeStart, timeEnd time.Time // All CDRs, no filter - if storedCdrs, _, err := psqlDb.GetStoredCdrs(new(utils.CdrsFilter)); err != nil { + if storedCdrs, _, err := psqlDb.GetCDRs(new(utils.CDRsFilter)); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 8 { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) } // Count ALL - if storedCdrs, count, err := psqlDb.GetStoredCdrs(&utils.CdrsFilter{Count: true}); err != nil { + if storedCdrs, count, err := psqlDb.GetCDRs(&utils.CDRsFilter{Count: true}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 0 { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) @@ -618,287 +618,275 @@ func TestPSQLGetStoredCdrs(t *testing.T) { t.Error("Unexpected count of StoredCdrs returned: ", count) } // Limit 5 - if storedCdrs, _, err := psqlDb.GetStoredCdrs(&utils.CdrsFilter{Paginator: utils.Paginator{Limit: utils.IntPointer(5), Offset: utils.IntPointer(0)}}); err != nil { + if storedCdrs, _, err := psqlDb.GetCDRs(&utils.CDRsFilter{Paginator: utils.Paginator{Limit: utils.IntPointer(5), Offset: utils.IntPointer(0)}}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 5 { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) } // Offset 5 - if storedCdrs, _, err := psqlDb.GetStoredCdrs(&utils.CdrsFilter{Paginator: utils.Paginator{Limit: utils.IntPointer(5), Offset: utils.IntPointer(0)}}); err != nil { + if storedCdrs, _, err := psqlDb.GetCDRs(&utils.CDRsFilter{Paginator: utils.Paginator{Limit: utils.IntPointer(5), Offset: utils.IntPointer(0)}}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 5 { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) } // Offset with limit 2 - if storedCdrs, _, err := psqlDb.GetStoredCdrs(&utils.CdrsFilter{Paginator: utils.Paginator{Limit: utils.IntPointer(2), Offset: utils.IntPointer(5)}}); err != nil { + if storedCdrs, _, err := psqlDb.GetCDRs(&utils.CDRsFilter{Paginator: utils.Paginator{Limit: utils.IntPointer(2), Offset: utils.IntPointer(5)}}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 2 { t.Error("Unexpected number of StoredCdrs returned: ", len(storedCdrs)) } - // Filter on cgrids - if storedCdrs, _, err := psqlDb.GetStoredCdrs(&utils.CdrsFilter{CgrIds: []string{utils.Sha1("bbb1", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()), + // Filter on CGRIDs + if storedCdrs, _, err := psqlDb.GetCDRs(&utils.CDRsFilter{CGRIDs: []string{utils.Sha1("bbb1", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()), utils.Sha1("bbb2", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String())}}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 2 { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) } // Count on CGRIDS - if _, count, err := psqlDb.GetStoredCdrs(&utils.CdrsFilter{CgrIds: []string{utils.Sha1("bbb1", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()), + if _, count, err := psqlDb.GetCDRs(&utils.CDRsFilter{CGRIDs: []string{utils.Sha1("bbb1", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()), utils.Sha1("bbb2", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String())}, Count: true}); err != nil { t.Error(err.Error()) } else if count != 2 { t.Error("Unexpected count of StoredCdrs returned: ", count) } - // Filter on cgrids plus reqType - if storedCdrs, _, err := psqlDb.GetStoredCdrs(&utils.CdrsFilter{CgrIds: []string{utils.Sha1("bbb1", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()), + // Filter on CGRIDs plus reqType + if storedCdrs, _, err := psqlDb.GetCDRs(&utils.CDRsFilter{CGRIDs: []string{utils.Sha1("bbb1", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()), utils.Sha1("bbb2", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String())}, ReqTypes: []string{utils.META_PREPAID}}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 1 { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) } // Count on multiple filter - if _, count, err := psqlDb.GetStoredCdrs(&utils.CdrsFilter{CgrIds: []string{utils.Sha1("bbb1", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()), + if _, count, err := psqlDb.GetCDRs(&utils.CDRsFilter{CGRIDs: []string{utils.Sha1("bbb1", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()), utils.Sha1("bbb2", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String())}, ReqTypes: []string{utils.META_PREPAID}, Count: true}); err != nil { t.Error(err.Error()) } else if count != 1 { t.Error("Unexpected count of StoredCdrs returned: ", count) } // Filter on runId - if storedCdrs, _, err := psqlDb.GetStoredCdrs(&utils.CdrsFilter{RunIds: []string{utils.DEFAULT_RUNID}}); err != nil { + if storedCdrs, _, err := psqlDb.GetCDRs(&utils.CDRsFilter{RunIDs: []string{utils.DEFAULT_RUNID}}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 2 { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) } // Filter on TOR - if storedCdrs, _, err := psqlDb.GetStoredCdrs(&utils.CdrsFilter{Tors: []string{utils.SMS}}); err != nil { + if storedCdrs, _, err := psqlDb.GetCDRs(&utils.CDRsFilter{TORs: []string{utils.SMS}}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 0 { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) } // Filter on multiple TOR - if storedCdrs, _, err := psqlDb.GetStoredCdrs(&utils.CdrsFilter{Tors: []string{utils.SMS, utils.VOICE}}); err != nil { + if storedCdrs, _, err := psqlDb.GetCDRs(&utils.CDRsFilter{TORs: []string{utils.SMS, utils.VOICE}}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 8 { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) } - // Filter on cdrHost - if storedCdrs, _, err := psqlDb.GetStoredCdrs(&utils.CdrsFilter{CdrHosts: []string{"192.168.1.2"}}); err != nil { + // Filter on OriginHost + if storedCdrs, _, err := psqlDb.GetCDRs(&utils.CDRsFilter{OriginHosts: []string{"192.168.1.2"}}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 3 { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) } - // Filter on multiple cdrHost - if storedCdrs, _, err := psqlDb.GetStoredCdrs(&utils.CdrsFilter{CdrHosts: []string{"192.168.1.1", "192.168.1.2"}}); err != nil { + // Filter on multiple OriginHost + if storedCdrs, _, err := psqlDb.GetCDRs(&utils.CDRsFilter{OriginHosts: []string{"192.168.1.1", "192.168.1.2"}}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 8 { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) } - // Filter on cdrSource - if storedCdrs, _, err := psqlDb.GetStoredCdrs(&utils.CdrsFilter{CdrSources: []string{"UNKNOWN"}}); err != nil { + // Filter on Source + if storedCdrs, _, err := psqlDb.GetCDRs(&utils.CDRsFilter{Sources: []string{"UNKNOWN"}}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 1 { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) } - // Filter on multiple cdrSource - if storedCdrs, _, err := psqlDb.GetStoredCdrs(&utils.CdrsFilter{CdrSources: []string{"UNKNOWN", "UNKNOWN2"}}); err != nil { + // Filter on multiple Source + if storedCdrs, _, err := psqlDb.GetCDRs(&utils.CDRsFilter{Sources: []string{"UNKNOWN", "UNKNOWN2"}}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 2 { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) } // Filter on reqType - if storedCdrs, _, err := psqlDb.GetStoredCdrs(&utils.CdrsFilter{ReqTypes: []string{utils.META_PREPAID}}); err != nil { + if storedCdrs, _, err := psqlDb.GetCDRs(&utils.CDRsFilter{ReqTypes: []string{utils.META_PREPAID}}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 2 { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) } // Filter on multiple reqType - if storedCdrs, _, err := psqlDb.GetStoredCdrs(&utils.CdrsFilter{ReqTypes: []string{utils.META_PREPAID, utils.META_PSEUDOPREPAID}}); err != nil { + if storedCdrs, _, err := psqlDb.GetCDRs(&utils.CDRsFilter{ReqTypes: []string{utils.META_PREPAID, utils.META_PSEUDOPREPAID}}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 3 { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) } // Filter on direction - if storedCdrs, _, err := psqlDb.GetStoredCdrs(&utils.CdrsFilter{Directions: []string{"*out"}}); err != nil { + if storedCdrs, _, err := psqlDb.GetCDRs(&utils.CDRsFilter{Directions: []string{"*out"}}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 8 { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) } // Filter on tenant - if storedCdrs, _, err := psqlDb.GetStoredCdrs(&utils.CdrsFilter{Tenants: []string{"itsyscom.com"}}); err != nil { + if storedCdrs, _, err := psqlDb.GetCDRs(&utils.CDRsFilter{Tenants: []string{"itsyscom.com"}}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 3 { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) } // Filter on multiple tenants - if storedCdrs, _, err := psqlDb.GetStoredCdrs(&utils.CdrsFilter{Tenants: []string{"itsyscom.com", "cgrates.org"}}); err != nil { + if storedCdrs, _, err := psqlDb.GetCDRs(&utils.CDRsFilter{Tenants: []string{"itsyscom.com", "cgrates.org"}}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 8 { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) } // Filter on category - if storedCdrs, _, err := psqlDb.GetStoredCdrs(&utils.CdrsFilter{Categories: []string{"premium_call"}}); err != nil { + if storedCdrs, _, err := psqlDb.GetCDRs(&utils.CDRsFilter{Categories: []string{"premium_call"}}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 1 { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) } // Filter on multiple categories - if storedCdrs, _, err := psqlDb.GetStoredCdrs(&utils.CdrsFilter{Categories: []string{"premium_call", "call"}}); err != nil { + if storedCdrs, _, err := psqlDb.GetCDRs(&utils.CDRsFilter{Categories: []string{"premium_call", "call"}}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 8 { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) } // Filter on account - if storedCdrs, _, err := psqlDb.GetStoredCdrs(&utils.CdrsFilter{Accounts: []string{"1002"}}); err != nil { + if storedCdrs, _, err := psqlDb.GetCDRs(&utils.CDRsFilter{Accounts: []string{"1002"}}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 3 { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) } // Filter on multiple account - if storedCdrs, _, err := psqlDb.GetStoredCdrs(&utils.CdrsFilter{Accounts: []string{"1001", "1002"}}); err != nil { + if storedCdrs, _, err := psqlDb.GetCDRs(&utils.CDRsFilter{Accounts: []string{"1001", "1002"}}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 8 { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) } // Filter on subject - if storedCdrs, _, err := psqlDb.GetStoredCdrs(&utils.CdrsFilter{Subjects: []string{"1000"}}); err != nil { + if storedCdrs, _, err := psqlDb.GetCDRs(&utils.CDRsFilter{Subjects: []string{"1000"}}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 1 { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) } // Filter on multiple subject - if storedCdrs, _, err := psqlDb.GetStoredCdrs(&utils.CdrsFilter{Subjects: []string{"1000", "1002"}}); err != nil { + if storedCdrs, _, err := psqlDb.GetCDRs(&utils.CDRsFilter{Subjects: []string{"1000", "1002"}}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 3 { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) } // Filter on destPrefix - if storedCdrs, _, err := psqlDb.GetStoredCdrs(&utils.CdrsFilter{DestPrefixes: []string{"+498651"}}); err != nil { + if storedCdrs, _, err := psqlDb.GetCDRs(&utils.CDRsFilter{DestinationPrefixes: []string{"+498651"}}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 3 { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) } - // Filter on multiple destPrefixes - if storedCdrs, _, err := psqlDb.GetStoredCdrs(&utils.CdrsFilter{DestPrefixes: []string{"1001", "+498651"}}); err != nil { + // Filter on multiple DestinationPrefixes + if storedCdrs, _, err := psqlDb.GetCDRs(&utils.CDRsFilter{DestinationPrefixes: []string{"1001", "+498651"}}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 4 { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) } - // Filter on ratedAccount - if storedCdrs, _, err := psqlDb.GetStoredCdrs(&utils.CdrsFilter{RatedAccounts: []string{"8001"}}); err != nil { - t.Error(err.Error()) - } else if len(storedCdrs) != 1 { - t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) - } - // Filter on ratedSubject - if storedCdrs, _, err := psqlDb.GetStoredCdrs(&utils.CdrsFilter{RatedSubjects: []string{"91001"}}); err != nil { - t.Error(err.Error()) - } else if len(storedCdrs) != 1 { - t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) - } // Filter on ignoreRated - var orderIdStart, orderIdEnd int64 // Capture also orderIds for the next test - if storedCdrs, _, err := psqlDb.GetStoredCdrs(&utils.CdrsFilter{MaxCost: utils.Float64Pointer(0.0)}); err != nil { + var OrderIDStart, OrderIDEnd int64 // Capture also orderIds for the next test + if storedCdrs, _, err := psqlDb.GetCDRs(&utils.CDRsFilter{MaxCost: utils.Float64Pointer(0.0)}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 5 { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) } else { for _, cdr := range storedCdrs { - if cdr.OrderId < orderIdStart { - orderIdStart = cdr.OrderId + if cdr.OrderID < OrderIDStart { + OrderIDStart = cdr.OrderID } - if cdr.OrderId > orderIdEnd { - orderIdEnd = cdr.OrderId + if cdr.OrderID > OrderIDEnd { + OrderIDEnd = cdr.OrderID } } } - // Filter on orderIdStart - if storedCdrs, _, err := psqlDb.GetStoredCdrs(&utils.CdrsFilter{OrderIdStart: orderIdStart}); err != nil { + // Filter on OrderIDStart + if storedCdrs, _, err := psqlDb.GetCDRs(&utils.CDRsFilter{OrderIDStart: OrderIDStart}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 8 { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) } - // Filter on orderIdStart and orderIdEnd - if storedCdrs, _, err := psqlDb.GetStoredCdrs(&utils.CdrsFilter{OrderIdStart: orderIdStart, OrderIdEnd: orderIdEnd}); err != nil { + // Filter on OrderIDStart and OrderIDEnd + if storedCdrs, _, err := psqlDb.GetCDRs(&utils.CDRsFilter{OrderIDStart: OrderIDStart, OrderIDEnd: OrderIDEnd}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 4 { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) } // Filter on timeStart timeStart = time.Date(2013, 11, 8, 8, 0, 0, 0, time.UTC) - if storedCdrs, _, err := psqlDb.GetStoredCdrs(&utils.CdrsFilter{AnswerTimeStart: &timeStart}); err != nil { + if storedCdrs, _, err := psqlDb.GetCDRs(&utils.CDRsFilter{AnswerTimeStart: &timeStart}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 5 { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) } // Filter on timeStart and timeEnd timeEnd = time.Date(2013, 12, 1, 8, 0, 0, 0, time.UTC) - if storedCdrs, _, err := psqlDb.GetStoredCdrs(&utils.CdrsFilter{AnswerTimeStart: &timeStart, AnswerTimeEnd: &timeEnd}); err != nil { + if storedCdrs, _, err := psqlDb.GetCDRs(&utils.CDRsFilter{AnswerTimeStart: &timeStart, AnswerTimeEnd: &timeEnd}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 2 { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) } - // Filter on minPdd - if storedCdrs, _, err := psqlDb.GetStoredCdrs(&utils.CdrsFilter{MinPdd: utils.Float64Pointer(3)}); err != nil { + // Filter on minPDD + if storedCdrs, _, err := psqlDb.GetCDRs(&utils.CDRsFilter{MinPDD: utils.Float64Pointer(3)}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 7 { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) } - // Filter on maxPdd - if storedCdrs, _, err := psqlDb.GetStoredCdrs(&utils.CdrsFilter{MaxPdd: utils.Float64Pointer(3)}); err != nil { + // Filter on maxPDD + if storedCdrs, _, err := psqlDb.GetCDRs(&utils.CDRsFilter{MaxPDD: utils.Float64Pointer(3)}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 1 { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) } - // Filter on minPdd, maxPdd - if storedCdrs, _, err := psqlDb.GetStoredCdrs(&utils.CdrsFilter{MinPdd: utils.Float64Pointer(3), MaxPdd: utils.Float64Pointer(5)}); err != nil { + // Filter on minPDD, maxPDD + if storedCdrs, _, err := psqlDb.GetCDRs(&utils.CDRsFilter{MinPDD: utils.Float64Pointer(3), MaxPDD: utils.Float64Pointer(5)}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 5 { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) } // Combined filter - if storedCdrs, _, err := psqlDb.GetStoredCdrs(&utils.CdrsFilter{ReqTypes: []string{utils.META_RATED}, AnswerTimeStart: &timeStart, AnswerTimeEnd: &timeEnd}); err != nil { + if storedCdrs, _, err := psqlDb.GetCDRs(&utils.CDRsFilter{ReqTypes: []string{utils.META_RATED}, AnswerTimeStart: &timeStart, AnswerTimeEnd: &timeEnd}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 1 { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) } // Filter on ignoreDerived - if storedCdrs, _, err := psqlDb.GetStoredCdrs(&utils.CdrsFilter{AnswerTimeStart: &timeStart, AnswerTimeEnd: &timeEnd, FilterOnRated: true}); err != nil { + if storedCdrs, _, err := psqlDb.GetCDRs(&utils.CDRsFilter{AnswerTimeStart: &timeStart, AnswerTimeEnd: &timeEnd, FilterOnRated: true}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 0 { // ToDo: Recheck this value t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) } } -func TestPSQLRemStoredCdrs(t *testing.T) { +func TestPSQLRemCDRs(t *testing.T) { if !*testLocal { return } - cgrIdB1 := utils.Sha1("bbb1", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()) - if err := psqlDb.RemStoredCdrs([]string{cgrIdB1}); err != nil { + CGRIDB1 := utils.Sha1("bbb1", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()) + if err := psqlDb.RemCDRs([]string{CGRIDB1}); err != nil { t.Error(err.Error()) } - if storedCdrs, _, err := psqlDb.GetStoredCdrs(new(utils.CdrsFilter)); err != nil { + if storedCdrs, _, err := psqlDb.GetCDRs(new(utils.CDRsFilter)); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 7 { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) } tm, _ := utils.ParseTimeDetectLayout("2013-11-08T08:42:20Z", "") - cgrIdA1 := utils.Sha1("aaa1", tm.String()) + CGRIDA1 := utils.Sha1("aaa1", tm.String()) tm, _ = utils.ParseTimeDetectLayout("2013-11-08T08:42:22Z", "") - cgrIdA2 := utils.Sha1("aaa2", tm.String()) + CGRIDA2 := utils.Sha1("aaa2", tm.String()) tm, _ = utils.ParseTimeDetectLayout("2013-11-07T08:42:24Z", "") - cgrIdA3 := utils.Sha1("aaa3", tm.String()) + CGRIDA3 := utils.Sha1("aaa3", tm.String()) tm, _ = utils.ParseTimeDetectLayout("2013-11-07T08:42:21Z", "") - cgrIdA4 := utils.Sha1("aaa4", tm.String()) + CGRIDA4 := utils.Sha1("aaa4", tm.String()) tm, _ = utils.ParseTimeDetectLayout("2013-11-07T08:42:25Z", "") - cgrIdA5 := utils.Sha1("aaa5", tm.String()) - cgrIdB2 := utils.Sha1("bbb2", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()) - cgrIdB3 := utils.Sha1("bbb3", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()) - if err := psqlDb.RemStoredCdrs([]string{cgrIdA1, cgrIdA2, cgrIdA3, cgrIdA4, cgrIdA5, - cgrIdB2, cgrIdB3}); err != nil { + CGRIDA5 := utils.Sha1("aaa5", tm.String()) + CGRIDB2 := utils.Sha1("bbb2", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()) + CGRIDB3 := utils.Sha1("bbb3", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()) + if err := psqlDb.RemCDRs([]string{CGRIDA1, CGRIDA2, CGRIDA3, CGRIDA4, CGRIDA5, + CGRIDB2, CGRIDB3}); err != nil { t.Error(err.Error()) } - if storedCdrs, _, err := psqlDb.GetStoredCdrs(new(utils.CdrsFilter)); err != nil { + if storedCdrs, _, err := psqlDb.GetCDRs(new(utils.CDRsFilter)); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 0 { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) @@ -910,13 +898,13 @@ func TestPSQLStoreRestoreCdr(t *testing.T) { if !*testLocal { return } - strCdr := &StoredCdr{TOR: utils.VOICE, AccId: "ccc1", CdrHost: "192.168.1.1", CdrSource: "TEST_CDR", ReqType: utils.META_RATED, + strCdr := &CDR{TOR: utils.VOICE, OriginID: "ccc1", OriginHost: "192.168.1.1", Source: "TEST_CDR", ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002", SetupTime: time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC), AnswerTime: time.Date(2013, 12, 7, 8, 42, 26, 0, time.UTC), - Usage: time.Duration(10) * time.Second, Pdd: time.Duration(3) * time.Second, Supplier: "SUPPL1", - ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, - MediationRunId: utils.DEFAULT_RUNID, Cost: 1.201} - strCdr.CgrId = utils.Sha1(strCdr.AccId, strCdr.SetupTime.String()) + Usage: time.Duration(10) * time.Second, PDD: time.Duration(3) * time.Second, Supplier: "SUPPL1", + ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, + RunID: utils.DEFAULT_RUNID, Cost: 1.201} + strCdr.CGRID = utils.Sha1(strCdr.OriginID, strCdr.SetupTime.String()) if err := psqlDb.SetCdr(strCdr); err != nil { t.Error(err.Error()) } @@ -924,16 +912,16 @@ func TestPSQLStoreRestoreCdr(t *testing.T) { t.Error(err.Error()) } // Check RawCdr - if rcvCdrs, _, err := psqlDb.GetStoredCdrs(&utils.CdrsFilter{CgrIds: []string{strCdr.CgrId}}); err != nil { + if rcvCdrs, _, err := psqlDb.GetCDRs(&utils.CDRsFilter{CGRIDs: []string{strCdr.CGRID}}); err != nil { t.Error(err.Error()) } else if len(rcvCdrs) != 1 { t.Errorf("Unexpected cdrs returned: %+v", rcvCdrs) } else { rcvCdr := rcvCdrs[0] - if strCdr.CgrId != rcvCdr.CgrId || + if strCdr.CGRID != rcvCdr.CGRID || strCdr.TOR != rcvCdr.TOR || - strCdr.AccId != rcvCdr.AccId || - strCdr.CdrHost != rcvCdr.CdrHost || + strCdr.OriginID != rcvCdr.OriginID || + strCdr.OriginHost != rcvCdr.OriginHost || strCdr.ReqType != rcvCdr.ReqType || strCdr.Direction != rcvCdr.Direction || strCdr.Tenant != rcvCdr.Tenant || @@ -944,7 +932,7 @@ func TestPSQLStoreRestoreCdr(t *testing.T) { !strCdr.SetupTime.Equal(rcvCdr.SetupTime) || !strCdr.AnswerTime.Equal(rcvCdr.AnswerTime) || strCdr.Usage != rcvCdr.Usage || - strCdr.Pdd != rcvCdr.Pdd || + strCdr.PDD != rcvCdr.PDD || strCdr.Supplier != rcvCdr.Supplier || strCdr.DisconnectCause != rcvCdr.DisconnectCause || !reflect.DeepEqual(strCdr.ExtraFields, rcvCdr.ExtraFields) { @@ -952,16 +940,16 @@ func TestPSQLStoreRestoreCdr(t *testing.T) { } } // Check RatedCdr - if rcvCdrs, _, err := psqlDb.GetStoredCdrs(&utils.CdrsFilter{CgrIds: []string{strCdr.CgrId}, FilterOnRated: true}); err != nil { + if rcvCdrs, _, err := psqlDb.GetCDRs(&utils.CDRsFilter{CGRIDs: []string{strCdr.CGRID}, FilterOnRated: true}); err != nil { t.Error(err.Error()) } else if len(rcvCdrs) != 1 { t.Errorf("Unexpected cdrs returned: %+v", rcvCdrs) } else { rcvCdr := rcvCdrs[0] - if strCdr.CgrId != rcvCdr.CgrId || + if strCdr.CGRID != rcvCdr.CGRID || strCdr.TOR != rcvCdr.TOR || - strCdr.AccId != rcvCdr.AccId || - strCdr.CdrHost != rcvCdr.CdrHost || + strCdr.OriginID != rcvCdr.OriginID || + strCdr.OriginHost != rcvCdr.OriginHost || strCdr.ReqType != rcvCdr.ReqType || strCdr.Direction != rcvCdr.Direction || strCdr.Tenant != rcvCdr.Tenant || @@ -972,7 +960,7 @@ func TestPSQLStoreRestoreCdr(t *testing.T) { //!strCdr.SetupTime.Equal(rcvCdr.SetupTime) || // FixMe //!strCdr.AnswerTime.Equal(rcvCdr.AnswerTime) || // FixMe strCdr.Usage != rcvCdr.Usage || - strCdr.Pdd != rcvCdr.Pdd || + strCdr.PDD != rcvCdr.PDD || strCdr.Supplier != rcvCdr.Supplier || strCdr.DisconnectCause != rcvCdr.DisconnectCause || strCdr.Cost != rcvCdr.Cost || diff --git a/engine/storage_redis_local_test.go b/engine/storage_redis_local_test.go index b4c43b05e..1bc618196 100644 --- a/engine/storage_redis_local_test.go +++ b/engine/storage_redis_local_test.go @@ -57,9 +57,9 @@ func TestSetGetDerivedCharges(t *testing.T) { } keyCharger1 := utils.ConcatenatedKey("*out", "cgrates.org", "call", "dan", "dan") charger1 := &utils.DerivedChargers{Chargers: []*utils.DerivedCharger{ - &utils.DerivedCharger{RunId: "extra1", ReqTypeField: "^prepaid", DirectionField: "*default", TenantField: "*default", CategoryField: "*default", + &utils.DerivedCharger{RunID: "extra1", ReqTypeField: "^prepaid", DirectionField: "*default", TenantField: "*default", CategoryField: "*default", AccountField: "rif", SubjectField: "rif", DestinationField: "*default", SetupTimeField: "*default", AnswerTimeField: "*default", UsageField: "*default"}, - &utils.DerivedCharger{RunId: "extra2", ReqTypeField: "*default", DirectionField: "*default", TenantField: "*default", CategoryField: "*default", + &utils.DerivedCharger{RunID: "extra2", ReqTypeField: "*default", DirectionField: "*default", TenantField: "*default", CategoryField: "*default", AccountField: "ivo", SubjectField: "ivo", DestinationField: "*default", SetupTimeField: "*default", AnswerTimeField: "*default", UsageField: "*default"}, }} if err := rds.SetDerivedChargers(keyCharger1, charger1); err != nil { diff --git a/engine/storage_sql.go b/engine/storage_sql.go index 7d302a0cf..b37335f4c 100644 --- a/engine/storage_sql.go +++ b/engine/storage_sql.go @@ -639,18 +639,18 @@ func (self *SQLStorage) LogActionPlan(source string, at *ActionPlan, as Actions) return } -func (self *SQLStorage) SetCdr(cdr *StoredCdr) error { +func (self *SQLStorage) SetCdr(cdr *CDR) error { extraFields, err := json.Marshal(cdr.ExtraFields) if err != nil { return err } tx := self.db.Begin() saved := tx.Save(&TblCdrs{ - Cgrid: cdr.CgrId, + Cgrid: cdr.CGRID, Tor: cdr.TOR, - Accid: cdr.AccId, - Cdrhost: cdr.CdrHost, - Cdrsource: cdr.CdrSource, + Accid: cdr.OriginID, + Cdrhost: cdr.OriginHost, + Cdrsource: cdr.Source, Reqtype: cdr.ReqType, Direction: cdr.Direction, Tenant: cdr.Tenant, @@ -661,7 +661,7 @@ func (self *SQLStorage) SetCdr(cdr *StoredCdr) error { SetupTime: cdr.SetupTime, AnswerTime: cdr.AnswerTime, Usage: cdr.Usage.Seconds(), - Pdd: cdr.Pdd.Seconds(), + Pdd: cdr.PDD.Seconds(), Supplier: cdr.Supplier, DisconnectCause: cdr.DisconnectCause, ExtraFields: string(extraFields), @@ -674,11 +674,11 @@ func (self *SQLStorage) SetCdr(cdr *StoredCdr) error { return nil } -func (self *SQLStorage) SetRatedCdr(cdr *StoredCdr) (err error) { +func (self *SQLStorage) SetRatedCdr(cdr *CDR) (err error) { tx := self.db.Begin() saved := tx.Save(&TblCdrs{ - Cgrid: cdr.CgrId, - Runid: cdr.MediationRunId, + Cgrid: cdr.CGRID, + Runid: cdr.RunID, Reqtype: cdr.ReqType, Direction: cdr.Direction, Tenant: cdr.Tenant, @@ -689,7 +689,7 @@ func (self *SQLStorage) SetRatedCdr(cdr *StoredCdr) (err error) { SetupTime: cdr.SetupTime, AnswerTime: cdr.AnswerTime, Usage: cdr.Usage.Seconds(), - Pdd: cdr.Pdd.Seconds(), + Pdd: cdr.PDD.Seconds(), Supplier: cdr.Supplier, DisconnectCause: cdr.DisconnectCause, Cost: cdr.Cost, @@ -699,9 +699,9 @@ func (self *SQLStorage) SetRatedCdr(cdr *StoredCdr) (err error) { if saved.Error != nil { tx.Rollback() tx = self.db.Begin() - updated := tx.Model(TblCdrs{}).Where(&TblCdrs{Cgrid: cdr.CgrId, Runid: cdr.MediationRunId}).Updates(&TblCdrs{Reqtype: cdr.ReqType, + updated := tx.Model(TblCdrs{}).Where(&TblCdrs{Cgrid: cdr.CGRID, Runid: cdr.RunID}).Updates(&TblCdrs{Reqtype: cdr.ReqType, Direction: cdr.Direction, Tenant: cdr.Tenant, Category: cdr.Category, Account: cdr.Account, Subject: cdr.Subject, Destination: cdr.Destination, - SetupTime: cdr.SetupTime, AnswerTime: cdr.AnswerTime, Usage: cdr.Usage.Seconds(), Pdd: cdr.Pdd.Seconds(), Supplier: cdr.Supplier, DisconnectCause: cdr.DisconnectCause, + SetupTime: cdr.SetupTime, AnswerTime: cdr.AnswerTime, Usage: cdr.Usage.Seconds(), Pdd: cdr.PDD.Seconds(), Supplier: cdr.Supplier, DisconnectCause: cdr.DisconnectCause, Cost: cdr.Cost, ExtraInfo: cdr.ExtraInfo, UpdatedAt: time.Now()}) if updated.Error != nil { @@ -714,8 +714,8 @@ func (self *SQLStorage) SetRatedCdr(cdr *StoredCdr) (err error) { } -func (self *SQLStorage) GetStoredCdrs(qryFltr *utils.CdrsFilter) ([]*StoredCdr, int64, error) { - var cdrs []*StoredCdr +func (self *SQLStorage) GetCDRs(qryFltr *utils.CDRsFilter) ([]*CDR, int64, error) { + var cdrs []*CDR q := self.db.Table(utils.TBL_CDRS).Select("*") if qryFltr.Unscoped { @@ -725,35 +725,35 @@ func (self *SQLStorage) GetStoredCdrs(qryFltr *utils.CdrsFilter) ([]*StoredCdr, q = q.Where("(deleted_at IS NULL OR deleted_at <= '0001-01-02')") // Soft deletes } // Add filters, use in to replace the high number of ORs - if len(qryFltr.CgrIds) != 0 { - q = q.Where("cgrid in (?)", qryFltr.CgrIds) + if len(qryFltr.CGRIDs) != 0 { + q = q.Where("cgrid in (?)", qryFltr.CGRIDs) } - if len(qryFltr.NotCgrIds) != 0 { - q = q.Where("cgrid not in (?)", qryFltr.NotCgrIds) + if len(qryFltr.NotCGRIDs) != 0 { + q = q.Where("cgrid not in (?)", qryFltr.NotCGRIDs) } - if len(qryFltr.RunIds) != 0 { - q = q.Where("runid in (?)", qryFltr.RunIds) + if len(qryFltr.RunIDs) != 0 { + q = q.Where("runid in (?)", qryFltr.RunIDs) } - if len(qryFltr.NotRunIds) != 0 { - q = q.Where("runid not in (?)", qryFltr.NotRunIds) + if len(qryFltr.NotRunIDs) != 0 { + q = q.Where("runid not in (?)", qryFltr.NotRunIDs) } - if len(qryFltr.Tors) != 0 { - q = q.Where("tor in (?)", qryFltr.Tors) + if len(qryFltr.TORs) != 0 { + q = q.Where("tor in (?)", qryFltr.TORs) } - if len(qryFltr.NotTors) != 0 { - q = q.Where("tor not in (?)", qryFltr.NotTors) + if len(qryFltr.NotTORs) != 0 { + q = q.Where("tor not in (?)", qryFltr.NotTORs) } - if len(qryFltr.CdrHosts) != 0 { - q = q.Where("cdrhost in (?)", qryFltr.CdrHosts) + if len(qryFltr.OriginHosts) != 0 { + q = q.Where("cdrhost in (?)", qryFltr.OriginHosts) } - if len(qryFltr.NotCdrHosts) != 0 { - q = q.Where("cdrhost not in (?)", qryFltr.NotCdrHosts) + if len(qryFltr.NotOriginHosts) != 0 { + q = q.Where("cdrhost not in (?)", qryFltr.NotOriginHosts) } - if len(qryFltr.CdrSources) != 0 { - q = q.Where("cdrsource in (?)", qryFltr.CdrSources) + if len(qryFltr.Sources) != 0 { + q = q.Where("cdrsource in (?)", qryFltr.Sources) } - if len(qryFltr.NotCdrSources) != 0 { - q = q.Where("cdrsource not in (?)", qryFltr.NotCdrSources) + if len(qryFltr.NotSources) != 0 { + q = q.Where("cdrsource not in (?)", qryFltr.NotSources) } if len(qryFltr.ReqTypes) != 0 { q = q.Where("reqtype in (?)", qryFltr.ReqTypes) @@ -791,9 +791,9 @@ func (self *SQLStorage) GetStoredCdrs(qryFltr *utils.CdrsFilter) ([]*StoredCdr, if len(qryFltr.NotSubjects) != 0 { q = q.Where("subject not in (?)", qryFltr.NotSubjects) } - if len(qryFltr.DestPrefixes) != 0 { // A bit ugly but still more readable than scopes provided by gorm + if len(qryFltr.DestinationPrefixes) != 0 { // A bit ugly but still more readable than scopes provided by gorm qIds := bytes.NewBufferString("(") - for idx, destPrefix := range qryFltr.DestPrefixes { + for idx, destPrefix := range qryFltr.DestinationPrefixes { if idx != 0 { qIds.WriteString(" OR") } @@ -802,9 +802,9 @@ func (self *SQLStorage) GetStoredCdrs(qryFltr *utils.CdrsFilter) ([]*StoredCdr, qIds.WriteString(" )") q = q.Where(qIds.String()) } - if len(qryFltr.NotDestPrefixes) != 0 { // A bit ugly but still more readable than scopes provided by gorm + if len(qryFltr.NotDestinationPrefixes) != 0 { // A bit ugly but still more readable than scopes provided by gorm qIds := bytes.NewBufferString("(") - for idx, destPrefix := range qryFltr.NotDestPrefixes { + for idx, destPrefix := range qryFltr.NotDestinationPrefixes { if idx != 0 { qIds.WriteString(" AND") } @@ -825,18 +825,6 @@ func (self *SQLStorage) GetStoredCdrs(qryFltr *utils.CdrsFilter) ([]*StoredCdr, if len(qryFltr.NotDisconnectCauses) != 0 { q = q.Where("disconnect_cause not in (?)", qryFltr.NotDisconnectCauses) } - if len(qryFltr.RatedAccounts) != 0 { - q = q.Where(utils.TBL_CDRS+".account in (?)", qryFltr.RatedAccounts) - } - if len(qryFltr.NotRatedAccounts) != 0 { - q = q.Where(utils.TBL_CDRS+".account not in (?)", qryFltr.NotRatedAccounts) - } - if len(qryFltr.RatedSubjects) != 0 { - q = q.Where(utils.TBL_CDRS+".subject in (?)", qryFltr.RatedSubjects) - } - if len(qryFltr.NotRatedSubjects) != 0 { - q = q.Where(utils.TBL_CDRS+".subject not in (?)", qryFltr.NotRatedSubjects) - } if len(qryFltr.Costs) != 0 { q = q.Where(utils.TBL_CDRS+".cost in (?)", qryFltr.Costs) } @@ -869,11 +857,11 @@ func (self *SQLStorage) GetStoredCdrs(qryFltr *utils.CdrsFilter) ([]*StoredCdr, qIds.WriteString(" )") q = q.Where(qIds.String()) } - if qryFltr.OrderIdStart != 0 { // Keep backwards compatible by testing 0 value - q = q.Where(utils.TBL_CDRS+".id >= ?", qryFltr.OrderIdStart) + if qryFltr.OrderIDStart != 0 { // Keep backwards compatible by testing 0 value + q = q.Where(utils.TBL_CDRS+".id >= ?", qryFltr.OrderIDStart) } - if qryFltr.OrderIdEnd != 0 { - q = q.Where(utils.TBL_CDRS+".id < ?", qryFltr.OrderIdEnd) + if qryFltr.OrderIDEnd != 0 { + q = q.Where(utils.TBL_CDRS+".id < ?", qryFltr.OrderIDEnd) } if qryFltr.SetupTimeStart != nil { q = q.Where("setup_time >= ?", qryFltr.SetupTimeStart) @@ -905,11 +893,11 @@ func (self *SQLStorage) GetStoredCdrs(qryFltr *utils.CdrsFilter) ([]*StoredCdr, if qryFltr.MaxUsage != nil { q = q.Where("usage < ?", qryFltr.MaxUsage) } - if qryFltr.MinPdd != nil { - q = q.Where("pdd >= ?", qryFltr.MinPdd) + if qryFltr.MinPDD != nil { + q = q.Where("pdd >= ?", qryFltr.MinPDD) } - if qryFltr.MaxPdd != nil { - q = q.Where("pdd < ?", qryFltr.MaxPdd) + if qryFltr.MaxPDD != nil { + q = q.Where("pdd < ?", qryFltr.MaxPDD) } if qryFltr.MinCost != nil { @@ -962,13 +950,13 @@ func (self *SQLStorage) GetStoredCdrs(qryFltr *utils.CdrsFilter) ([]*StoredCdr, } usageDur, _ := time.ParseDuration(strconv.FormatFloat(result.Usage, 'f', -1, 64) + "s") pddDur, _ := time.ParseDuration(strconv.FormatFloat(result.Pdd, 'f', -1, 64) + "s") - storCdr := &StoredCdr{ - CgrId: result.Cgrid, - OrderId: result.Id, + storCdr := &CDR{ + CGRID: result.Cgrid, + OrderID: result.Id, TOR: result.Tor, - AccId: result.Accid, - CdrHost: result.Cdrhost, - CdrSource: result.Cdrsource, + OriginID: result.Accid, + OriginHost: result.Cdrhost, + Source: result.Cdrsource, ReqType: result.Reqtype, Direction: result.Direction, Tenant: result.Tenant, @@ -977,15 +965,13 @@ func (self *SQLStorage) GetStoredCdrs(qryFltr *utils.CdrsFilter) ([]*StoredCdr, Subject: result.Subject, Destination: result.Destination, SetupTime: result.SetupTime, - Pdd: pddDur, + PDD: pddDur, AnswerTime: result.AnswerTime, Usage: usageDur, Supplier: result.Supplier, DisconnectCause: result.DisconnectCause, ExtraFields: extraFieldsMp, - MediationRunId: result.Runid, - RatedAccount: result.Account, - RatedSubject: result.Subject, + RunID: result.Runid, Cost: result.Cost, ExtraInfo: result.ExtraInfo, } @@ -1011,7 +997,7 @@ func (self *SQLStorage) GetStoredCdrs(qryFltr *utils.CdrsFilter) ([]*StoredCdr, } // Remove CDR data out of all CDR tables based on their cgrid -func (self *SQLStorage) RemStoredCdrs(cgrIds []string) error { +func (self *SQLStorage) RemCDRs(cgrIds []string) error { if len(cgrIds) == 0 { return nil } diff --git a/engine/suretax.go b/engine/suretax.go index cbf7d3666..b112b3fac 100644 --- a/engine/suretax.go +++ b/engine/suretax.go @@ -36,7 +36,7 @@ import ( var sureTaxClient *http.Client // Cache the client here if in use // Init a new request to be sent out to SureTax -func NewSureTaxRequest(cdr *StoredCdr, stCfg *config.SureTaxCfg) (*SureTaxRequest, error) { +func NewSureTaxRequest(cdr *CDR, stCfg *config.SureTaxCfg) (*SureTaxRequest, error) { if stCfg == nil { return nil, errors.New("Invalid SureTax config.") } @@ -176,7 +176,7 @@ type STTaxItem struct { TaxAmount string // Tax Amount } -func SureTaxProcessCdr(cdr *StoredCdr) error { +func SureTaxProcessCdr(cdr *CDR) error { stCfg := config.CgrConfig().SureTaxCfg() if stCfg == nil { return errors.New("Invalid SureTax configuration") diff --git a/engine/suretax_test.go b/engine/suretax_test.go index c6f897814..e38f8ec81 100644 --- a/engine/suretax_test.go +++ b/engine/suretax_test.go @@ -29,12 +29,13 @@ import ( ) func TestNewSureTaxRequest(t *testing.T) { - cgrId := utils.Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 20, 0, time.UTC).String()) - cdr := &StoredCdr{CgrId: cgrId, OrderId: 123, TOR: utils.VOICE, - AccId: "dsafdsaf", CdrHost: "192.168.1.1", CdrSource: utils.UNIT_TEST, ReqType: utils.META_RATED, Direction: "*out", + CGRID := utils.Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 20, 0, time.UTC).String()) + cdr := &CDR{CGRID: CGRID, OrderID: 123, TOR: utils.VOICE, + OriginID: "dsafdsaf", OriginHost: "192.168.1.1", Source: utils.UNIT_TEST, ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002", Supplier: "SUPPL1", - SetupTime: time.Date(2013, 11, 7, 8, 42, 20, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), MediationRunId: utils.DEFAULT_RUNID, - Usage: time.Duration(12) * time.Second, Pdd: time.Duration(7) * time.Second, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, RatedAccount: "dan", RatedSubject: "dans", Rated: true, + SetupTime: time.Date(2013, 11, 7, 8, 42, 20, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), RunID: utils.DEFAULT_RUNID, + Usage: time.Duration(12) * time.Second, PDD: time.Duration(7) * time.Second, + ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, Rated: true, } cfg, _ := config.NewDefaultCGRConfig() stCfg := cfg.SureTaxCfg() @@ -48,7 +49,7 @@ func TestNewSureTaxRequest(t *testing.T) { DataMonth: "11", TotalRevenue: 1.01, ReturnFileCode: "0", - ClientTracking: cgrId, + ClientTracking: CGRID, ResponseGroup: "03", ResponseType: "D4", ItemList: []*STRequestItem{ diff --git a/engine/tp_reader.go b/engine/tp_reader.go index 5b93103cc..a52ba0cbb 100644 --- a/engine/tp_reader.go +++ b/engine/tp_reader.go @@ -898,7 +898,7 @@ func (tpr *TpReader) LoadDerivedChargersFiltered(filter *TpDerivedCharger, save tag := tpDcs.GetDerivedChargersKey() if _, hasIt := tpr.derivedChargers[tag]; !hasIt { tpr.derivedChargers[tag] = &utils.DerivedChargers{ - DestinationIds: make(utils.StringMap), + DestinationIDs: make(utils.StringMap), Chargers: make([]*utils.DerivedCharger, 0), } // Load object map since we use this method also from LoadDerivedChargers } @@ -909,7 +909,7 @@ func (tpr *TpReader) LoadDerivedChargersFiltered(filter *TpDerivedCharger, save if err != nil { return err } - tpr.derivedChargers[tag].DestinationIds.Copy(utils.ParseStringMap(tpDcs.DestinationIds)) + tpr.derivedChargers[tag].DestinationIDs.Copy(utils.ParseStringMap(tpDcs.DestinationIds)) tpr.derivedChargers[tag].Chargers = append(tpr.derivedChargers[tag].Chargers, dc) } } diff --git a/engine/units_counter_test.go b/engine/units_counter_test.go index 5be3b8393..de50aff05 100644 --- a/engine/units_counter_test.go +++ b/engine/units_counter_test.go @@ -251,42 +251,42 @@ func TestUnitCountersResetCounterById(t *testing.T) { ActionTriggers: ActionTriggers{ &ActionTrigger{ Id: "TestTR1", - ThresholdType: TRIGGER_MAX_EVENT_COUNTER, + ThresholdType: utils.TRIGGER_MAX_EVENT_COUNTER, BalanceType: utils.MONETARY, BalanceDirections: utils.NewStringMap(utils.OUT, utils.IN), BalanceWeight: 10, }, &ActionTrigger{ Id: "TestTR11", - ThresholdType: TRIGGER_MAX_EVENT_COUNTER, + ThresholdType: utils.TRIGGER_MAX_EVENT_COUNTER, BalanceType: utils.MONETARY, BalanceDirections: utils.NewStringMap(utils.OUT, utils.IN), BalanceWeight: 10, }, &ActionTrigger{ Id: "TestTR2", - ThresholdType: TRIGGER_MAX_EVENT_COUNTER, + ThresholdType: utils.TRIGGER_MAX_EVENT_COUNTER, BalanceType: utils.VOICE, BalanceDirections: utils.NewStringMap(utils.OUT, utils.IN), BalanceWeight: 10, }, &ActionTrigger{ Id: "TestTR3", - ThresholdType: TRIGGER_MAX_BALANCE_COUNTER, + ThresholdType: utils.TRIGGER_MAX_BALANCE_COUNTER, BalanceType: utils.VOICE, BalanceDirections: utils.NewStringMap(utils.OUT, utils.IN), BalanceWeight: 10, }, &ActionTrigger{ Id: "TestTR4", - ThresholdType: TRIGGER_MAX_BALANCE_COUNTER, + ThresholdType: utils.TRIGGER_MAX_BALANCE_COUNTER, BalanceType: utils.SMS, BalanceDirections: utils.NewStringMap(utils.OUT, utils.IN), BalanceWeight: 10, }, &ActionTrigger{ Id: "TestTR5", - ThresholdType: TRIGGER_MAX_BALANCE, + ThresholdType: utils.TRIGGER_MAX_BALANCE, BalanceType: utils.SMS, BalanceDirections: utils.NewStringMap(utils.OUT, utils.IN), BalanceWeight: 10, diff --git a/engine/users_test.go b/engine/users_test.go index 0862d96fe..ae508b8dc 100644 --- a/engine/users_test.go +++ b/engine/users_test.go @@ -626,7 +626,7 @@ func TestUsersUsageRecordGetLoadUserProfile(t *testing.T) { } } -func TestUsersExternalCdrGetLoadUserProfileExtraFields(t *testing.T) { +func TestUsersExternalCDRGetLoadUserProfileExtraFields(t *testing.T) { userService = &UserMap{ table: map[string]map[string]string{ "test:user": map[string]string{"TOR": "01", "ReqType": "1", "Direction": "*out", "Category": "c1", "Account": "dan", "Subject": "0723", "Destination": "+401", "SetupTime": "s1", "AnswerTime": "t1", "Usage": "10"}, @@ -637,7 +637,7 @@ func TestUsersExternalCdrGetLoadUserProfileExtraFields(t *testing.T) { index: make(map[string]map[string]bool), } - ur := &ExternalCdr{ + ur := &ExternalCDR{ TOR: utils.USERS, ReqType: utils.USERS, Direction: "*out", @@ -658,7 +658,7 @@ func TestUsersExternalCdrGetLoadUserProfileExtraFields(t *testing.T) { if err != nil { t.Error("Error loading user profile: ", err) } - expected := &ExternalCdr{ + expected := &ExternalCDR{ TOR: "04", ReqType: "4", Direction: "*out", @@ -679,7 +679,7 @@ func TestUsersExternalCdrGetLoadUserProfileExtraFields(t *testing.T) { } } -func TestUsersExternalCdrGetLoadUserProfileExtraFieldsNotFound(t *testing.T) { +func TestUsersExternalCDRGetLoadUserProfileExtraFieldsNotFound(t *testing.T) { userService = &UserMap{ table: map[string]map[string]string{ "test:user": map[string]string{"TOR": "01", "ReqType": "1", "Direction": "*out", "Category": "c1", "Account": "dan", "Subject": "0723", "Destination": "+401", "SetupTime": "s1", "AnswerTime": "t1", "Usage": "10"}, @@ -690,7 +690,7 @@ func TestUsersExternalCdrGetLoadUserProfileExtraFieldsNotFound(t *testing.T) { index: make(map[string]map[string]bool), } - ur := &ExternalCdr{ + ur := &ExternalCDR{ TOR: utils.USERS, ReqType: utils.USERS, Direction: "*out", @@ -713,7 +713,7 @@ func TestUsersExternalCdrGetLoadUserProfileExtraFieldsNotFound(t *testing.T) { } } -func TestUsersExternalCdrGetLoadUserProfileExtraFieldsSet(t *testing.T) { +func TestUsersExternalCDRGetLoadUserProfileExtraFieldsSet(t *testing.T) { userService = &UserMap{ table: map[string]map[string]string{ "test:user": map[string]string{"TOR": "01", "ReqType": "1", "Direction": "*out", "Category": "c1", "Account": "dan", "Subject": "0723", "Destination": "+401", "SetupTime": "s1", "AnswerTime": "t1", "Usage": "10"}, @@ -724,7 +724,7 @@ func TestUsersExternalCdrGetLoadUserProfileExtraFieldsSet(t *testing.T) { index: make(map[string]map[string]bool), } - ur := &ExternalCdr{ + ur := &ExternalCDR{ TOR: utils.USERS, ReqType: utils.USERS, Direction: "*out", @@ -746,7 +746,7 @@ func TestUsersExternalCdrGetLoadUserProfileExtraFieldsSet(t *testing.T) { if err != nil { t.Error("Error loading user profile: ", err) } - expected := &ExternalCdr{ + expected := &ExternalCDR{ TOR: "04", ReqType: "4", Direction: "*out", @@ -809,7 +809,7 @@ func TestUsersCallDescLoadUserProfile(t *testing.T) { } } -func TestUsersStoredCdrLoadUserProfile(t *testing.T) { +func TestUsersCDRLoadUserProfile(t *testing.T) { userService = &UserMap{ table: map[string]map[string]string{ "cgrates.org:dan": map[string]string{"ReqType": "*prepaid", "Category": "call1", "Account": "dan", "Subject": "dan", "Cli": "+4986517174963"}, @@ -819,7 +819,7 @@ func TestUsersStoredCdrLoadUserProfile(t *testing.T) { index: make(map[string]map[string]bool), } startTime := time.Now() - cdr := &StoredCdr{ + cdr := &CDR{ TOR: "*sms", ReqType: utils.USERS, Tenant: utils.USERS, @@ -832,7 +832,7 @@ func TestUsersStoredCdrLoadUserProfile(t *testing.T) { Usage: time.Duration(1) * time.Minute, ExtraFields: map[string]string{"Cli": "+4986517174963"}, } - expected := &StoredCdr{ + expected := &CDR{ TOR: "*sms", ReqType: "*prepaid", Tenant: "cgrates.org", diff --git a/general_tests/auth_test.go b/general_tests/auth_test.go index d976c5c8e..bd170cde5 100644 --- a/general_tests/auth_test.go +++ b/general_tests/auth_test.go @@ -93,7 +93,7 @@ RP_ANY,DR_ANY_1CNT,*any,10` } func TestAuthPostpaidNoAcnt(t *testing.T) { - cdr := &engine.StoredCdr{TOR: utils.VOICE, ReqType: utils.META_POSTPAID, Direction: "*out", Tenant: "cgrates.org", + cdr := &engine.CDR{TOR: utils.VOICE, ReqType: utils.META_POSTPAID, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "nonexistent", Subject: "testauthpostpaid1", Destination: "4986517174963", SetupTime: time.Date(2015, 8, 27, 11, 26, 0, 0, time.UTC)} var maxSessionTime float64 @@ -104,7 +104,7 @@ func TestAuthPostpaidNoAcnt(t *testing.T) { func TestAuthPostpaidNoDestination(t *testing.T) { // Test subject which does not have destination attached - cdr := &engine.StoredCdr{TOR: utils.VOICE, ReqType: utils.META_POSTPAID, Direction: "*out", Tenant: "cgrates.org", + cdr := &engine.CDR{TOR: utils.VOICE, ReqType: utils.META_POSTPAID, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "testauthpostpaid1", Subject: "testauthpostpaid1", Destination: "441231234", SetupTime: time.Date(2015, 8, 27, 11, 26, 0, 0, time.UTC)} var maxSessionTime float64 @@ -115,7 +115,7 @@ func TestAuthPostpaidNoDestination(t *testing.T) { func TestAuthPostpaidFallbackDest(t *testing.T) { // Test subject which has fallback for destination - cdr := &engine.StoredCdr{TOR: utils.VOICE, ReqType: utils.META_POSTPAID, Direction: "*out", Tenant: "cgrates.org", + cdr := &engine.CDR{TOR: utils.VOICE, ReqType: utils.META_POSTPAID, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "testauthpostpaid1", Subject: "testauthpostpaid2", Destination: "441231234", SetupTime: time.Date(2015, 8, 27, 11, 26, 0, 0, time.UTC)} var maxSessionTime float64 @@ -128,7 +128,7 @@ func TestAuthPostpaidFallbackDest(t *testing.T) { func TestAuthPostpaidWithDestination(t *testing.T) { // Test subject which does not have destination attached - cdr := &engine.StoredCdr{TOR: utils.VOICE, ReqType: utils.META_POSTPAID, Direction: "*out", Tenant: "cgrates.org", + cdr := &engine.CDR{TOR: utils.VOICE, ReqType: utils.META_POSTPAID, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "testauthpostpaid1", Subject: "testauthpostpaid1", Destination: "4986517174963", SetupTime: time.Date(2015, 8, 27, 11, 26, 0, 0, time.UTC)} var maxSessionTime float64 diff --git a/general_tests/fsevcorelate_test.go b/general_tests/fsevcorelate_test.go index 0928ebc93..fdb1059af 100644 --- a/general_tests/fsevcorelate_test.go +++ b/general_tests/fsevcorelate_test.go @@ -222,11 +222,11 @@ func TestEvCorelate(t *testing.T) { cdrEv, err := engine.NewFSCdr(jsonCdr, cfg) if err != nil { t.Errorf("Error loading cdr: %v", err.Error()) - } else if cdrEv.AsStoredCdr("").AccId != "86cfd6e2-dbda-45a3-b59d-f683ec368e8b" { - t.Error("Unexpected acntId received", cdrEv.AsStoredCdr("").AccId) + } else if cdrEv.AsStoredCdr("").OriginID != "86cfd6e2-dbda-45a3-b59d-f683ec368e8b" { + t.Error("Unexpected acntId received", cdrEv.AsStoredCdr("").OriginID) } - if answerEv.GetCgrId("") != cdrEv.AsStoredCdr("").CgrId { - t.Error("CgrIds do not match", answerEv.GetCgrId(""), cdrEv.AsStoredCdr("").CgrId) + if answerEv.GetCgrId("") != cdrEv.AsStoredCdr("").CGRID { + t.Error("CGRIDs do not match", answerEv.GetCgrId(""), cdrEv.AsStoredCdr("").CGRID) } } @@ -554,18 +554,18 @@ func TestEvCdrCorelate(t *testing.T) { cdrEv, err := engine.NewFSCdr(jsonCdr2, cfg) if err != nil { t.Errorf("Error loading cdr: %v", err.Error()) - } else if cdrEv.AsStoredCdr("").AccId != "e3133bf7-dcde-4daf-9663-9a79ffcef5ad" { - t.Error("Unexpected acntId received", cdrEv.AsStoredCdr("").AccId) + } else if cdrEv.AsStoredCdr("").OriginID != "e3133bf7-dcde-4daf-9663-9a79ffcef5ad" { + t.Error("Unexpected acntId received", cdrEv.AsStoredCdr("").OriginID) } jsnStoredCdr := cdrEv.AsStoredCdr("") - if evStoredCdr.CgrId != jsnStoredCdr.CgrId { - t.Errorf("evStoredCdr.CgrId: %s, jsnStoredCdr.CgrId: %s", evStoredCdr.CgrId, jsnStoredCdr.CgrId) + if evStoredCdr.CGRID != jsnStoredCdr.CGRID { + t.Errorf("evStoredCdr.CGRID: %s, jsnStoredCdr.CGRID: %s", evStoredCdr.CGRID, jsnStoredCdr.CGRID) } if evStoredCdr.TOR != jsnStoredCdr.TOR { t.Errorf("evStoredCdr.TOR: %s, jsnStoredCdr.TOR: %s", evStoredCdr.TOR, jsnStoredCdr.TOR) } - if evStoredCdr.AccId != jsnStoredCdr.AccId { - t.Errorf("evStoredCdr.AccId: %s, jsnStoredCdr.AccId: %s", evStoredCdr.AccId, jsnStoredCdr.AccId) + if evStoredCdr.OriginID != jsnStoredCdr.OriginID { + t.Errorf("evStoredCdr.OriginID: %s, jsnStoredCdr.OriginID: %s", evStoredCdr.OriginID, jsnStoredCdr.OriginID) } if evStoredCdr.ReqType != jsnStoredCdr.ReqType { t.Errorf("evStoredCdr.ReqType: %s, jsnStoredCdr.ReqType: %s", evStoredCdr.ReqType, jsnStoredCdr.ReqType) @@ -591,8 +591,8 @@ func TestEvCdrCorelate(t *testing.T) { if evStoredCdr.SetupTime != jsnStoredCdr.SetupTime { t.Errorf("evStoredCdr.SetupTime: %v, jsnStoredCdr.SetupTime: %v", evStoredCdr.SetupTime, jsnStoredCdr.SetupTime) } - if evStoredCdr.Pdd != jsnStoredCdr.Pdd { - t.Errorf("evStoredCdr.Pdd: %v, jsnStoredCdr.Pdd: %v", evStoredCdr.Pdd, jsnStoredCdr.Pdd) + if evStoredCdr.PDD != jsnStoredCdr.PDD { + t.Errorf("evStoredCdr.PDD: %v, jsnStoredCdr.PDD: %v", evStoredCdr.PDD, jsnStoredCdr.PDD) } if evStoredCdr.AnswerTime != jsnStoredCdr.AnswerTime { t.Errorf("evStoredCdr.AnswerTime: %v, jsnStoredCdr.AnswerTime: %v", evStoredCdr.AnswerTime, jsnStoredCdr.AnswerTime) diff --git a/general_tests/suretax_it_test.go b/general_tests/suretax_it_test.go index b5eacd153..3b3ed68f8 100644 --- a/general_tests/suretax_it_test.go +++ b/general_tests/suretax_it_test.go @@ -133,11 +133,11 @@ func TestSTIProcessExternalCdr(t *testing.T) { if !*testSureTax { return } - cdr := &engine.ExternalCdr{TOR: utils.VOICE, - AccId: "teststicdr1", CdrHost: "192.168.1.1", CdrSource: "STI_TEST", ReqType: utils.META_RATED, Direction: utils.OUT, + cdr := &engine.ExternalCDR{TOR: utils.VOICE, + OriginID: "teststicdr1", OriginHost: "192.168.1.1", Source: "STI_TEST", ReqType: utils.META_RATED, Direction: utils.OUT, Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "+14082342500", Destination: "+16268412300", Supplier: "SUPPL1", SetupTime: "2015-10-18T13:00:00Z", AnswerTime: "2015-10-18T13:00:00Z", - Usage: "15s", Pdd: "7.0", ExtraFields: map[string]string{"CustomerNumber": "000000534", "ZipCode": ""}, + Usage: "15s", PDD: "7.0", ExtraFields: map[string]string{"CustomerNumber": "000000534", "ZipCode": ""}, } var reply string if err := stiRpc.Call("CdrsV2.ProcessExternalCdr", cdr, &reply); err != nil { @@ -152,8 +152,8 @@ func TestSTIGetCdrs(t *testing.T) { if !*testSureTax { return } - var cdrs []*engine.ExternalCdr - req := utils.RpcCdrsFilter{RunIds: []string{utils.META_DEFAULT}, Accounts: []string{"1001"}} + var cdrs []*engine.ExternalCDR + req := utils.RPCCDRsFilter{RunIDs: []string{utils.META_DEFAULT}, Accounts: []string{"1001"}} if err := stiRpc.Call("ApierV2.GetCdrs", req, &cdrs); err != nil { t.Error("Unexpected error: ", err.Error()) } else if len(cdrs) != 1 { @@ -163,7 +163,7 @@ func TestSTIGetCdrs(t *testing.T) { t.Errorf("Unexpected Cost for CDR: %+v", cdrs[0]) } } - req = utils.RpcCdrsFilter{RunIds: []string{utils.META_SURETAX}, Accounts: []string{"1001"}} + req = utils.RPCCDRsFilter{RunIDs: []string{utils.META_SURETAX}, Accounts: []string{"1001"}} if err := stiRpc.Call("ApierV2.GetCdrs", req, &cdrs); err != nil { t.Error("Unexpected error: ", err.Error()) } else if len(cdrs) != 1 { diff --git a/general_tests/tutorial_fs_calls_test.go b/general_tests/tutorial_fs_calls_test.go index 7d9494e5e..6585c0de4 100644 --- a/general_tests/tutorial_fs_calls_test.go +++ b/general_tests/tutorial_fs_calls_test.go @@ -330,18 +330,18 @@ func TestTutFsCalls1001Cdrs(t *testing.T) { if !*testCalls { return } - var reply []*engine.ExternalCdr - var cgrId string // Share with getCostDetails + var reply []*engine.ExternalCDR + var CGRID string // Share with getCostDetails var cCost engine.CallCost - req := utils.RpcCdrsFilter{RunIds: []string{utils.META_DEFAULT}, Accounts: []string{"1001"}, DestPrefixes: []string{"1002"}} + req := utils.RPCCDRsFilter{RunIDs: []string{utils.META_DEFAULT}, Accounts: []string{"1001"}, DestinationPrefixes: []string{"1002"}} if err := tutFsCallsRpc.Call("ApierV2.GetCdrs", req, &reply); err != nil { t.Error("Unexpected error: ", err.Error()) } else if len(reply) != 1 { t.Error("Unexpected number of CDRs returned: ", len(reply)) } else { - cgrId = reply[0].CgrId - if reply[0].CdrSource != "freeswitch_json" { - t.Errorf("Unexpected CdrSource for CDR: %+v", reply[0]) + CGRID = reply[0].CGRID + if reply[0].Source != "freeswitch_json" { + t.Errorf("Unexpected Source for CDR: %+v", reply[0]) } if reply[0].ReqType != utils.META_PREPAID { t.Errorf("Unexpected ReqType for CDR: %+v", reply[0]) @@ -357,19 +357,19 @@ func TestTutFsCalls1001Cdrs(t *testing.T) { //} } // Make sure call cost contains the matched information - if err := tutFsCallsRpc.Call("ApierV2.GetCallCostLog", utils.AttrGetCallCost{CgrId: cgrId}, &cCost); err != nil { + if err := tutFsCallsRpc.Call("ApierV2.GetCallCostLog", utils.AttrGetCallCost{CgrId: CGRID}, &cCost); err != nil { t.Error("Unexpected error: ", err.Error()) } else if utils.IsSliceMember([]string{cCost.Timespans[0].MatchedSubject, cCost.Timespans[0].MatchedPrefix, cCost.Timespans[0].MatchedDestId}, "") { t.Errorf("Unexpected Matched* for CallCost: %+v", cCost.Timespans[0]) } - req = utils.RpcCdrsFilter{RunIds: []string{utils.META_DEFAULT}, Accounts: []string{"1001"}, DestPrefixes: []string{"1003"}} + req = utils.RPCCDRsFilter{RunIDs: []string{utils.META_DEFAULT}, Accounts: []string{"1001"}, DestinationPrefixes: []string{"1003"}} if err := tutFsCallsRpc.Call("ApierV2.GetCdrs", req, &reply); err != nil { t.Error("Unexpected error: ", err.Error()) } else if len(reply) != 1 { t.Error("Unexpected number of CDRs returned: ", len(reply)) } else { - cgrId = reply[0].CgrId + CGRID = reply[0].CGRID if reply[0].ReqType != utils.META_PREPAID { t.Errorf("Unexpected ReqType for CDR: %+v", reply[0]) } @@ -381,12 +381,12 @@ func TestTutFsCalls1001Cdrs(t *testing.T) { } } // Make sure call cost contains the matched information - if err := tutFsCallsRpc.Call("ApierV2.GetCallCostLog", utils.AttrGetCallCost{CgrId: cgrId}, &cCost); err != nil { + if err := tutFsCallsRpc.Call("ApierV2.GetCallCostLog", utils.AttrGetCallCost{CgrId: CGRID}, &cCost); err != nil { t.Error("Unexpected error: ", err.Error()) } else if utils.IsSliceMember([]string{cCost.Timespans[0].MatchedSubject, cCost.Timespans[0].MatchedPrefix, cCost.Timespans[0].MatchedDestId}, "") { t.Errorf("Unexpected Matched* for CallCost: %+v", cCost.Timespans[0]) } - req = utils.RpcCdrsFilter{Accounts: []string{"1001"}, RunIds: []string{"derived_run1"}, FilterOnRated: true} + req = utils.RPCCDRsFilter{Accounts: []string{"1001"}, RunIDs: []string{"derived_run1"}} if err := tutFsCallsRpc.Call("ApierV2.GetCdrs", req, &reply); err != nil { t.Error("Unexpected error: ", err.Error()) } else if len(reply) != 2 { @@ -407,15 +407,15 @@ func TestTutFsCalls1002Cdrs(t *testing.T) { if !*testCalls { return } - var reply []*engine.ExternalCdr - req := utils.RpcCdrsFilter{Accounts: []string{"1002"}, RunIds: []string{utils.META_DEFAULT}} + var reply []*engine.ExternalCDR + req := utils.RPCCDRsFilter{Accounts: []string{"1002"}, RunIDs: []string{utils.META_DEFAULT}} if err := tutFsCallsRpc.Call("ApierV2.GetCdrs", req, &reply); err != nil { t.Error("Unexpected error: ", err.Error()) } else if len(reply) != 2 { // Should be counted here also call originated form 1006 which is aliased to 1002 t.Error("Unexpected number of CDRs returned: ", len(reply)) } else { - if reply[0].CdrSource != "freeswitch_json" { - t.Errorf("Unexpected CdrSource for CDR: %+v", reply[0]) + if reply[0].Source != "freeswitch_json" { + t.Errorf("Unexpected Source for CDR: %+v", reply[0]) } if reply[0].ReqType != utils.META_POSTPAID { t.Errorf("Unexpected ReqType for CDR: %+v", reply[0]) @@ -434,15 +434,15 @@ func TestTutFsCalls1003Cdrs(t *testing.T) { if !*testCalls { return } - var reply []*engine.ExternalCdr - req := utils.RpcCdrsFilter{Accounts: []string{"1003"}, RunIds: []string{utils.META_DEFAULT}} + var reply []*engine.ExternalCDR + req := utils.RPCCDRsFilter{Accounts: []string{"1003"}, RunIDs: []string{utils.META_DEFAULT}} if err := tutFsCallsRpc.Call("ApierV2.GetCdrs", req, &reply); err != nil { t.Error("Unexpected error: ", err.Error()) } else if len(reply) != 1 { t.Error("Unexpected number of CDRs returned: ", len(reply)) } else { - if reply[0].CdrSource != "freeswitch_json" { - t.Errorf("Unexpected CdrSource for CDR: %+v", reply[0]) + if reply[0].Source != "freeswitch_json" { + t.Errorf("Unexpected Source for CDR: %+v", reply[0]) } if reply[0].ReqType != utils.META_PSEUDOPREPAID { t.Errorf("Unexpected ReqType for CDR: %+v", reply[0]) @@ -462,15 +462,15 @@ func TestTutFsCalls1004Cdrs(t *testing.T) { if !*testCalls { return } - var reply []*engine.ExternalCdr - req := utils.RpcCdrsFilter{Accounts: []string{"1004"}, RunIds: []string{utils.META_DEFAULT}} + var reply []*engine.ExternalCDR + req := utils.RPCCDRsFilter{Accounts: []string{"1004"}, RunIDs: []string{utils.META_DEFAULT}} if err := tutFsCallsRpc.Call("ApierV2.GetCdrs", req, &reply); err != nil { t.Error("Unexpected error: ", err.Error()) } else if len(reply) != 1 { t.Error("Unexpected number of CDRs returned: ", len(reply)) } else { - if reply[0].CdrSource != "freeswitch_json" { - t.Errorf("Unexpected CdrSource for CDR: %+v", reply[0]) + if reply[0].Source != "freeswitch_json" { + t.Errorf("Unexpected Source for CDR: %+v", reply[0]) } if reply[0].ReqType != utils.META_RATED { t.Errorf("Unexpected ReqType for CDR: %+v", reply[0]) @@ -490,8 +490,8 @@ func TestTutFsCalls1006Cdrs(t *testing.T) { if !*testCalls { return } - var reply []*engine.ExternalCdr - req := utils.RpcCdrsFilter{Accounts: []string{"1006"}, RunIds: []string{utils.META_DEFAULT}} + var reply []*engine.ExternalCDR + req := utils.RPCCDRsFilter{Accounts: []string{"1006"}, RunIDs: []string{utils.META_DEFAULT}} if err := tutFsCallsRpc.Call("ApierV2.GetCdrs", req, &reply); err != nil { t.Error("Unexpected error: ", err.Error()) } else if len(reply) != 0 { @@ -504,15 +504,15 @@ func TestTutFsCalls1007Cdrs(t *testing.T) { if !*testCalls { return } - var reply []*engine.ExternalCdr - req := utils.RpcCdrsFilter{Accounts: []string{"1007"}, RunIds: []string{utils.META_DEFAULT}} + var reply []*engine.ExternalCDR + req := utils.RPCCDRsFilter{Accounts: []string{"1007"}, RunIDs: []string{utils.META_DEFAULT}} if err := tutFsCallsRpc.Call("ApierV2.GetCdrs", req, &reply); err != nil { t.Error("Unexpected error: ", err.Error()) } else if len(reply) != 1 { t.Error("Unexpected number of CDRs returned: ", len(reply)) } else { - if reply[0].CdrSource != "freeswitch_json" { - t.Errorf("Unexpected CdrSource for CDR: %+v", reply[0]) + if reply[0].Source != "freeswitch_json" { + t.Errorf("Unexpected Source for CDR: %+v", reply[0]) } if reply[0].ReqType != utils.META_PREPAID { t.Errorf("Unexpected ReqType for CDR: %+v", reply[0]) diff --git a/general_tests/tutorial_kam_calls_test.go b/general_tests/tutorial_kam_calls_test.go index c9f90885d..32af04488 100644 --- a/general_tests/tutorial_kam_calls_test.go +++ b/general_tests/tutorial_kam_calls_test.go @@ -330,18 +330,18 @@ func TestTutKamCalls1001Cdrs(t *testing.T) { if !*testCalls { return } - var reply []*engine.ExternalCdr + var reply []*engine.ExternalCDR var cgrId string // Share with getCostDetails var cCost engine.CallCost - req := utils.RpcCdrsFilter{RunIds: []string{utils.META_DEFAULT}, Accounts: []string{"1001"}, DestPrefixes: []string{"1002"}} + req := utils.RPCCDRsFilter{RunIDs: []string{utils.META_DEFAULT}, Accounts: []string{"1001"}, DestinationPrefixes: []string{"1002"}} if err := tutKamCallsRpc.Call("ApierV2.GetCdrs", req, &reply); err != nil { t.Error("Unexpected error: ", err.Error()) } else if len(reply) != 1 { t.Error("Unexpected number of CDRs returned: ", len(reply)) } else { - cgrId = reply[0].CgrId - if reply[0].CdrSource != "KAMAILIO_CGR_CALL_END" { - t.Errorf("Unexpected CdrSource for CDR: %+v", reply[0]) + cgrId = reply[0].CGRID + if reply[0].Source != "KAMAILIO_CGR_CALL_END" { + t.Errorf("Unexpected Source for CDR: %+v", reply[0]) } if reply[0].ReqType != utils.META_PREPAID { t.Errorf("Unexpected ReqType for CDR: %+v", reply[0]) @@ -363,13 +363,13 @@ func TestTutKamCalls1001Cdrs(t *testing.T) { t.Errorf("Unexpected Matched* for CallCost: %+v", cCost.Timespans[0]) } - req = utils.RpcCdrsFilter{RunIds: []string{utils.META_DEFAULT}, Accounts: []string{"1001"}, DestPrefixes: []string{"1003"}} + req = utils.RPCCDRsFilter{RunIDs: []string{utils.META_DEFAULT}, Accounts: []string{"1001"}, DestinationPrefixes: []string{"1003"}} if err := tutKamCallsRpc.Call("ApierV2.GetCdrs", req, &reply); err != nil { t.Error("Unexpected error: ", err.Error()) } else if len(reply) != 1 { t.Error("Unexpected number of CDRs returned: ", len(reply)) } else { - cgrId = reply[0].CgrId + cgrId = reply[0].CGRID if reply[0].ReqType != utils.META_PREPAID { t.Errorf("Unexpected ReqType for CDR: %+v", reply[0]) } @@ -386,7 +386,7 @@ func TestTutKamCalls1001Cdrs(t *testing.T) { } else if utils.IsSliceMember([]string{cCost.Timespans[0].MatchedSubject, cCost.Timespans[0].MatchedPrefix, cCost.Timespans[0].MatchedDestId}, "") { t.Errorf("Unexpected Matched* for CallCost: %+v", cCost.Timespans[0]) } - req = utils.RpcCdrsFilter{Accounts: []string{"1001"}, RunIds: []string{"derived_run1"}, FilterOnRated: true} + req = utils.RPCCDRsFilter{Accounts: []string{"1001"}, RunIDs: []string{"derived_run1"}} if err := tutKamCallsRpc.Call("ApierV2.GetCdrs", req, &reply); err != nil { t.Error("Unexpected error: ", err.Error()) } else if len(reply) != 2 { @@ -407,15 +407,15 @@ func TestTutKamCalls1002Cdrs(t *testing.T) { if !*testCalls { return } - var reply []*engine.ExternalCdr - req := utils.RpcCdrsFilter{Accounts: []string{"1002"}, RunIds: []string{utils.META_DEFAULT}} + var reply []*engine.ExternalCDR + req := utils.RPCCDRsFilter{Accounts: []string{"1002"}, RunIDs: []string{utils.META_DEFAULT}} if err := tutKamCallsRpc.Call("ApierV2.GetCdrs", req, &reply); err != nil { t.Error("Unexpected error: ", err.Error()) } else if len(reply) != 2 { t.Error("Unexpected number of CDRs returned: ", len(reply)) } else { - if reply[0].CdrSource != "KAMAILIO_CGR_CALL_END" { - t.Errorf("Unexpected CdrSource for CDR: %+v", reply[0]) + if reply[0].Source != "KAMAILIO_CGR_CALL_END" { + t.Errorf("Unexpected Source for CDR: %+v", reply[0]) } if reply[0].ReqType != utils.META_POSTPAID { t.Errorf("Unexpected ReqType for CDR: %+v", reply[0]) @@ -434,15 +434,15 @@ func TestTutKamCalls1003Cdrs(t *testing.T) { if !*testCalls { return } - var reply []*engine.ExternalCdr - req := utils.RpcCdrsFilter{Accounts: []string{"1003"}, RunIds: []string{utils.META_DEFAULT}} + var reply []*engine.ExternalCDR + req := utils.RPCCDRsFilter{Accounts: []string{"1003"}, RunIDs: []string{utils.META_DEFAULT}} if err := tutKamCallsRpc.Call("ApierV2.GetCdrs", req, &reply); err != nil { t.Error("Unexpected error: ", err.Error()) } else if len(reply) != 1 { t.Error("Unexpected number of CDRs returned: ", len(reply)) } else { - if reply[0].CdrSource != "KAMAILIO_CGR_CALL_END" { - t.Errorf("Unexpected CdrSource for CDR: %+v", reply[0]) + if reply[0].Source != "KAMAILIO_CGR_CALL_END" { + t.Errorf("Unexpected Source for CDR: %+v", reply[0]) } if reply[0].ReqType != utils.META_PSEUDOPREPAID { t.Errorf("Unexpected ReqType for CDR: %+v", reply[0]) @@ -462,15 +462,15 @@ func TestTutKamCalls1004Cdrs(t *testing.T) { if !*testCalls { return } - var reply []*engine.ExternalCdr - req := utils.RpcCdrsFilter{Accounts: []string{"1004"}, RunIds: []string{utils.META_DEFAULT}} + var reply []*engine.ExternalCDR + req := utils.RPCCDRsFilter{Accounts: []string{"1004"}, RunIDs: []string{utils.META_DEFAULT}} if err := tutKamCallsRpc.Call("ApierV2.GetCdrs", req, &reply); err != nil { t.Error("Unexpected error: ", err.Error()) } else if len(reply) != 1 { t.Error("Unexpected number of CDRs returned: ", len(reply)) } else { - if reply[0].CdrSource != "KAMAILIO_CGR_CALL_END" { - t.Errorf("Unexpected CdrSource for CDR: %+v", reply[0]) + if reply[0].Source != "KAMAILIO_CGR_CALL_END" { + t.Errorf("Unexpected Source for CDR: %+v", reply[0]) } if reply[0].ReqType != utils.META_RATED { t.Errorf("Unexpected ReqType for CDR: %+v", reply[0]) @@ -490,8 +490,8 @@ func TestTutKamCalls1006Cdrs(t *testing.T) { if !*testCalls { return } - var reply []*engine.ExternalCdr - req := utils.RpcCdrsFilter{Accounts: []string{"1006"}, RunIds: []string{utils.META_DEFAULT}} + var reply []*engine.ExternalCDR + req := utils.RPCCDRsFilter{Accounts: []string{"1006"}, RunIDs: []string{utils.META_DEFAULT}} if err := tutKamCallsRpc.Call("ApierV2.GetCdrs", req, &reply); err != nil { t.Error("Unexpected error: ", err.Error()) } else if len(reply) != 0 { @@ -504,15 +504,15 @@ func TestTutKamCalls1007Cdrs(t *testing.T) { if !*testCalls { return } - var reply []*engine.ExternalCdr - req := utils.RpcCdrsFilter{Accounts: []string{"1007"}, RunIds: []string{utils.META_DEFAULT}} + var reply []*engine.ExternalCDR + req := utils.RPCCDRsFilter{Accounts: []string{"1007"}, RunIDs: []string{utils.META_DEFAULT}} if err := tutKamCallsRpc.Call("ApierV2.GetCdrs", req, &reply); err != nil { t.Error("Unexpected error: ", err.Error()) } else if len(reply) != 1 { t.Error("Unexpected number of CDRs returned: ", len(reply)) } else { - if reply[0].CdrSource != "KAMAILIO_CGR_CALL_END" { - t.Errorf("Unexpected CdrSource for CDR: %+v", reply[0]) + if reply[0].Source != "KAMAILIO_CGR_CALL_END" { + t.Errorf("Unexpected Source for CDR: %+v", reply[0]) } if reply[0].ReqType != utils.META_PREPAID { t.Errorf("Unexpected ReqType for CDR: %+v", reply[0]) diff --git a/general_tests/tutorial_local_test.go b/general_tests/tutorial_local_test.go index 5cbf192df..0755a3dd6 100644 --- a/general_tests/tutorial_local_test.go +++ b/general_tests/tutorial_local_test.go @@ -416,11 +416,11 @@ func TestTutLocalDerivedMaxSessionTime(t *testing.T) { return } tStart := time.Date(2014, 8, 4, 13, 0, 0, 0, time.UTC) - ev := engine.StoredCdr{ - CgrId: utils.Sha1("testevent1", tStart.String()), + ev := engine.CDR{ + CGRID: utils.Sha1("testevent1", tStart.String()), TOR: utils.VOICE, - AccId: "testevent1", - CdrHost: "127.0.0.1", + OriginID: "testevent1", + OriginHost: "127.0.0.1", ReqType: utils.META_PREPAID, Direction: utils.OUT, Tenant: "cgrates.org", @@ -490,11 +490,11 @@ func TestTutLocalProcessExternalCdr(t *testing.T) { if !*testLocal { return } - cdr := &engine.ExternalCdr{TOR: utils.VOICE, - AccId: "testextcdr1", CdrHost: "192.168.1.1", CdrSource: utils.UNIT_TEST, ReqType: utils.META_RATED, Direction: utils.OUT, + cdr := &engine.ExternalCDR{TOR: utils.VOICE, + OriginID: "testextcdr1", OriginHost: "192.168.1.1", Source: utils.UNIT_TEST, ReqType: utils.META_RATED, Direction: utils.OUT, Tenant: "cgrates.org", Category: "call", Account: "1003", Subject: "1003", Destination: "1001", Supplier: "SUPPL1", SetupTime: "2014-08-04T13:00:00Z", AnswerTime: "2014-08-04T13:00:07Z", - Usage: "1", Pdd: "7.0", ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, + Usage: "1", PDD: "7.0", ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, } var reply string if err := tutLocalRpc.Call("CdrsV2.ProcessExternalCdr", cdr, &reply); err != nil { @@ -509,11 +509,11 @@ func TestTutLocalProcessExternalCdrUP(t *testing.T) { if !*testLocal { return } - cdr := &engine.ExternalCdr{TOR: utils.VOICE, - AccId: "testextcdr2", CdrHost: "192.168.1.1", CdrSource: utils.UNIT_TEST, Direction: utils.OUT, + cdr := &engine.ExternalCDR{TOR: utils.VOICE, + OriginID: "testextcdr2", OriginHost: "192.168.1.1", Source: utils.UNIT_TEST, Direction: utils.OUT, ReqType: utils.USERS, Tenant: utils.USERS, Account: utils.USERS, Destination: "1001", Supplier: "SUPPL1", SetupTime: "2014-08-04T13:00:00Z", AnswerTime: "2014-08-04T13:00:07Z", - Usage: "2", Pdd: "0.2", DisconnectCause: "NORMAL_DISCONNECT", + Usage: "2", PDD: "0.2", DisconnectCause: "NORMAL_DISCONNECT", ExtraFields: map[string]string{"Cli": "+4986517174964", "fieldextr2": "valextr2", "SysUserName": utils.USERS}, } var reply string @@ -522,29 +522,29 @@ func TestTutLocalProcessExternalCdrUP(t *testing.T) { } else if reply != utils.OK { t.Error("Unexpected reply received: ", reply) } - eCdr := &engine.ExternalCdr{CgrId: "63a8d2bfeca2cfb790826c3ec461696d6574cfde", OrderId: 2, - TOR: utils.VOICE, - AccId: "testextcdr2", CdrHost: "192.168.1.1", CdrSource: utils.UNIT_TEST, ReqType: utils.META_RATED, Direction: utils.OUT, + eCdr := &engine.ExternalCDR{CGRID: "63a8d2bfeca2cfb790826c3ec461696d6574cfde", OrderID: 2, + TOR: utils.VOICE, + OriginID: "testextcdr2", OriginHost: "192.168.1.1", Source: utils.UNIT_TEST, ReqType: utils.META_RATED, Direction: utils.OUT, Tenant: "cgrates.org", Category: "call", Account: "1004", Subject: "1004", Destination: "1001", Supplier: "SUPPL1", SetupTime: time.Date(2014, 8, 4, 13, 0, 0, 0, time.UTC).Local().Format(time.RFC3339), AnswerTime: time.Date(2014, 8, 4, 13, 0, 7, 0, time.UTC).Local().Format(time.RFC3339), - Usage: "2", Pdd: "0.2", DisconnectCause: "NORMAL_DISCONNECT", - ExtraFields: map[string]string{"Cli": "+4986517174964", "fieldextr2": "valextr2", "SysUserName": "danb4"}, - MediationRunId: utils.DEFAULT_RUNID, Cost: 1} - var cdrs []*engine.ExternalCdr - req := utils.RpcCdrsFilter{RunIds: []string{utils.META_DEFAULT}, Accounts: []string{"1004"}, DestPrefixes: []string{"1001"}} + Usage: "2", PDD: "0.2", DisconnectCause: "NORMAL_DISCONNECT", + ExtraFields: map[string]string{"Cli": "+4986517174964", "fieldextr2": "valextr2", "SysUserName": "danb4"}, + RunID: utils.DEFAULT_RUNID, Cost: 1} + var cdrs []*engine.ExternalCDR + req := utils.RPCCDRsFilter{RunIDs: []string{utils.META_DEFAULT}, Accounts: []string{"1004"}, DestinationPrefixes: []string{"1001"}} if err := tutLocalRpc.Call("ApierV2.GetCdrs", req, &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].CgrId != eCdr.CgrId { - t.Errorf("Unexpected CgrId for CDR: %+v", cdrs[0]) + if cdrs[0].CGRID != eCdr.CGRID { + t.Errorf("Unexpected CGRID for CDR: %+v", cdrs[0]) } if cdrs[0].TOR != eCdr.TOR { t.Errorf("Unexpected TOR for CDR: %+v", cdrs[0]) } - if cdrs[0].CdrSource != eCdr.CdrSource { - t.Errorf("Unexpected CdrSource for CDR: %+v", cdrs[0]) + if cdrs[0].Source != eCdr.Source { + t.Errorf("Unexpected Source for CDR: %+v", cdrs[0]) } if cdrs[0].ReqType != eCdr.ReqType { t.Errorf("Unexpected ReqType for CDR: %+v", cdrs[0]) @@ -570,8 +570,8 @@ func TestTutLocalProcessExternalCdrUP(t *testing.T) { if cdrs[0].SetupTime != eCdr.SetupTime { t.Errorf("Unexpected SetupTime for CDR: %+v", cdrs[0]) } - if cdrs[0].Pdd != eCdr.Pdd { - t.Errorf("Unexpected Pdd for CDR: %+v", cdrs[0]) + if cdrs[0].PDD != eCdr.PDD { + t.Errorf("Unexpected PDD for CDR: %+v", cdrs[0]) } if cdrs[0].AnswerTime != eCdr.AnswerTime { t.Errorf("Unexpected AnswerTime for CDR: %+v", cdrs[0]) @@ -589,11 +589,11 @@ func TestTutLocalCostErrors(t *testing.T) { if !*testLocal { return } - cdr := &engine.ExternalCdr{TOR: utils.VOICE, - AccId: "testtutlocal_1", CdrHost: "192.168.1.1", CdrSource: utils.UNIT_TEST, ReqType: utils.META_RATED, Direction: utils.OUT, + cdr := &engine.ExternalCDR{TOR: utils.VOICE, + OriginID: "testtutlocal_1", OriginHost: "192.168.1.1", Source: utils.UNIT_TEST, ReqType: utils.META_RATED, Direction: utils.OUT, Tenant: "cgrates.org", Category: "fake", Account: "2001", Subject: "2001", Destination: "1001", Supplier: "SUPPL1", SetupTime: "2014-08-04T13:00:00Z", AnswerTime: "2014-08-04T13:00:07Z", - Usage: "1", Pdd: "7.0", ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, + Usage: "1", PDD: "7.0", ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, } var reply string if err := tutLocalRpc.Call("CdrsV2.ProcessExternalCdr", cdr, &reply); err != nil { @@ -602,25 +602,25 @@ func TestTutLocalCostErrors(t *testing.T) { t.Error("Unexpected reply received: ", reply) } time.Sleep(time.Duration(*waitRater) * time.Millisecond) - var cdrs []*engine.ExternalCdr - req := utils.RpcCdrsFilter{RunIds: []string{utils.META_DEFAULT}, Accounts: []string{cdr.Account}, DestPrefixes: []string{cdr.Destination}} + var cdrs []*engine.ExternalCDR + req := utils.RPCCDRsFilter{RunIDs: []string{utils.META_DEFAULT}, Accounts: []string{cdr.Account}, DestinationPrefixes: []string{cdr.Destination}} if err := tutLocalRpc.Call("ApierV2.GetCdrs", req, &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].AccId != cdr.AccId { - t.Errorf("Unexpected AccId for Cdr received: %+v", cdrs[0]) + if cdrs[0].OriginID != cdr.OriginID { + t.Errorf("Unexpected OriginID for Cdr received: %+v", cdrs[0]) } if cdrs[0].Cost != -1 { t.Errorf("Unexpected Cost for Cdr received: %+v", cdrs[0]) } } - cdr2 := &engine.ExternalCdr{TOR: utils.VOICE, - AccId: "testtutlocal_2", CdrHost: "192.168.1.1", CdrSource: utils.UNIT_TEST, ReqType: utils.META_POSTPAID, Direction: utils.OUT, + cdr2 := &engine.ExternalCDR{TOR: utils.VOICE, + OriginID: "testtutlocal_2", OriginHost: "192.168.1.1", Source: utils.UNIT_TEST, ReqType: utils.META_POSTPAID, Direction: utils.OUT, Tenant: "cgrates.org", Category: "fake", Account: "2002", Subject: "2002", Destination: "1001", Supplier: "SUPPL1", SetupTime: "2014-08-04T13:00:00Z", AnswerTime: "2014-08-04T13:00:07Z", - Usage: "1", Pdd: "7.0", ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, + Usage: "1", PDD: "7.0", ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, } if err := tutLocalRpc.Call("CdrsV2.ProcessExternalCdr", cdr2, &reply); err != nil { t.Error("Unexpected error: ", err.Error()) @@ -628,24 +628,24 @@ func TestTutLocalCostErrors(t *testing.T) { t.Error("Unexpected reply received: ", reply) } time.Sleep(time.Duration(*waitRater) * time.Millisecond) // Give time for CDR to be processed - req = utils.RpcCdrsFilter{RunIds: []string{utils.META_DEFAULT}, Accounts: []string{cdr2.Account}, DestPrefixes: []string{cdr2.Destination}} + req = utils.RPCCDRsFilter{RunIDs: []string{utils.META_DEFAULT}, Accounts: []string{cdr2.Account}, DestinationPrefixes: []string{cdr2.Destination}} if err := tutLocalRpc.Call("ApierV2.GetCdrs", req, &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].AccId != cdr2.AccId { - t.Errorf("Unexpected AccId for Cdr received: %+v", cdrs[0]) + if cdrs[0].OriginID != cdr2.OriginID { + t.Errorf("Unexpected OriginID for Cdr received: %+v", cdrs[0]) } if cdrs[0].Cost != -1 { t.Errorf("Unexpected Cost for Cdr received: %+v", cdrs[0]) } } - cdr3 := &engine.ExternalCdr{TOR: utils.VOICE, - AccId: "testtutlocal_3", CdrHost: "192.168.1.1", CdrSource: utils.UNIT_TEST, ReqType: utils.META_POSTPAID, Direction: utils.OUT, + cdr3 := &engine.ExternalCDR{TOR: utils.VOICE, + OriginID: "testtutlocal_3", OriginHost: "192.168.1.1", Source: utils.UNIT_TEST, ReqType: utils.META_POSTPAID, Direction: utils.OUT, Tenant: "cgrates.org", Category: "fake", Account: "1001", Subject: "1001", Destination: "2002", Supplier: "SUPPL1", SetupTime: "2014-08-04T13:00:00Z", AnswerTime: "2014-08-04T13:00:07Z", - Usage: "1", Pdd: "7.0", ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, + Usage: "1", PDD: "7.0", ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, } if err := tutLocalRpc.Call("CdrsV2.ProcessExternalCdr", cdr3, &reply); err != nil { t.Error("Unexpected error: ", err.Error()) @@ -653,14 +653,14 @@ func TestTutLocalCostErrors(t *testing.T) { t.Error("Unexpected reply received: ", reply) } time.Sleep(time.Duration(*waitRater) * time.Millisecond) // Give time for CDR to be processed - req = utils.RpcCdrsFilter{RunIds: []string{utils.META_DEFAULT}, Accounts: []string{cdr3.Account}, DestPrefixes: []string{cdr3.Destination}} + req = utils.RPCCDRsFilter{RunIDs: []string{utils.META_DEFAULT}, Accounts: []string{cdr3.Account}, DestinationPrefixes: []string{cdr3.Destination}} if err := tutLocalRpc.Call("ApierV2.GetCdrs", req, &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].AccId != cdr3.AccId { - t.Errorf("Unexpected AccId for Cdr received: %+v", cdrs[0]) + if cdrs[0].OriginID != cdr3.OriginID { + t.Errorf("Unexpected OriginID for Cdr received: %+v", cdrs[0]) } if cdrs[0].Cost != -1 { t.Errorf("Unexpected Cost for Cdr received: %+v", cdrs[0]) @@ -820,20 +820,20 @@ func TestTutLocalLcrQos(t *testing.T) { t.Errorf("Expecting: %+v, received: %+v", eStLcr.SupplierCosts[0], lcr.SupplierCosts[0]) } // Post some CDRs to influence stats - testCdr1 := &engine.StoredCdr{CgrId: utils.Sha1("testcdr1", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()), - TOR: utils.VOICE, AccId: "testcdr1", CdrHost: "192.168.1.1", CdrSource: "TEST_QOS_LCR", ReqType: utils.META_RATED, + testCdr1 := &engine.CDR{CGRID: utils.Sha1("testcdr1", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()), + TOR: utils.VOICE, OriginID: "testcdr1", OriginHost: "192.168.1.1", Source: "TEST_QOS_LCR", ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002", SetupTime: time.Date(2014, 12, 7, 8, 42, 24, 0, time.UTC), AnswerTime: time.Date(2014, 12, 7, 8, 42, 26, 0, time.UTC), Usage: time.Duration(2) * time.Minute, Supplier: "suppl1", ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}} - testCdr2 := &engine.StoredCdr{CgrId: utils.Sha1("testcdr2", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()), - TOR: utils.VOICE, AccId: "testcdr2", CdrHost: "192.168.1.1", CdrSource: "TEST_QOS_LCR", ReqType: utils.META_RATED, + testCdr2 := &engine.CDR{CGRID: utils.Sha1("testcdr2", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()), + TOR: utils.VOICE, OriginID: "testcdr2", OriginHost: "192.168.1.1", Source: "TEST_QOS_LCR", ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1002", Subject: "1002", Destination: "1003", SetupTime: time.Date(2014, 12, 7, 8, 42, 24, 0, time.UTC), AnswerTime: time.Date(2014, 12, 7, 8, 42, 26, 0, time.UTC), Usage: time.Duration(90) * time.Second, Supplier: "suppl2", ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}} var reply string - for _, cdr := range []*engine.StoredCdr{testCdr1, testCdr2} { + for _, cdr := range []*engine.CDR{testCdr1, testCdr2} { if err := tutLocalRpc.Call("CdrsV2.ProcessCdr", cdr, &reply); err != nil { t.Error("Unexpected error: ", err.Error()) } else if reply != utils.OK { @@ -858,8 +858,8 @@ func TestTutLocalLcrQos(t *testing.T) { //} else if !reflect.DeepEqual(eStLcr.SupplierCosts, lcr.SupplierCosts) && !reflect.DeepEqual(eStLcr2.SupplierCosts, lcr.SupplierCosts) { // t.Errorf("Expecting: %+v, %+v, received: %+v, %+v", eStLcr.SupplierCosts[0], eStLcr.SupplierCosts[1], lcr.SupplierCosts[0], lcr.SupplierCosts[1]) } - testCdr3 := &engine.StoredCdr{CgrId: utils.Sha1("testcdr3", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()), - TOR: utils.VOICE, AccId: "testcdr3", CdrHost: "192.168.1.1", CdrSource: "TEST_QOS_LCR", ReqType: utils.META_RATED, + testCdr3 := &engine.CDR{CGRID: utils.Sha1("testcdr3", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()), + TOR: utils.VOICE, OriginID: "testcdr3", OriginHost: "192.168.1.1", Source: "TEST_QOS_LCR", ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1003", Subject: "1003", Destination: "1004", SetupTime: time.Date(2014, 12, 7, 8, 42, 24, 0, time.UTC), AnswerTime: time.Date(2014, 12, 7, 8, 42, 26, 0, time.UTC), Usage: time.Duration(180) * time.Second, Supplier: "suppl2"} @@ -922,8 +922,8 @@ func TestTutLocalLcrQosThreshold(t *testing.T) { //} else if !reflect.DeepEqual(eLcr.SupplierCosts, lcr.SupplierCosts) { // t.Errorf("Expecting: %+v, %+v received: %+v, %+v", eLcr.SupplierCosts[0], eLcr.SupplierCosts[1], lcr.SupplierCosts[0], lcr.SupplierCosts[1]) } - testCdr4 := &engine.StoredCdr{CgrId: utils.Sha1("testcdr4", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()), - TOR: utils.VOICE, AccId: "testcdr4", CdrHost: "192.168.1.1", CdrSource: "TEST_QOS_LCR", ReqType: utils.META_RATED, + testCdr4 := &engine.CDR{CGRID: utils.Sha1("testcdr4", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()), + TOR: utils.VOICE, OriginID: "testcdr4", OriginHost: "192.168.1.1", Source: "TEST_QOS_LCR", ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1003", Subject: "1003", Destination: "1004", SetupTime: time.Date(2014, 12, 7, 8, 42, 24, 0, time.UTC), AnswerTime: time.Date(2014, 12, 7, 8, 42, 26, 0, time.UTC), Usage: time.Duration(60) * time.Second, Supplier: "suppl2"} @@ -985,8 +985,8 @@ func TestTutLocalLcrQosThreshold(t *testing.T) { //} else if !reflect.DeepEqual(eLcr.SupplierCosts, lcr.SupplierCosts) && !reflect.DeepEqual(eLcr2.SupplierCosts, lcr.SupplierCosts) { // t.Errorf("Expecting: %+v, received: %+v", eLcr.SupplierCosts[1], lcr.SupplierCosts[1]) } - testCdr5 := &engine.StoredCdr{CgrId: utils.Sha1("testcdr5", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()), - TOR: utils.VOICE, AccId: "testcdr5", CdrHost: "192.168.1.1", CdrSource: "TEST_QOS_LCR", ReqType: utils.META_RATED, + testCdr5 := &engine.CDR{CGRID: utils.Sha1("testcdr5", time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC).String()), + TOR: utils.VOICE, OriginID: "testcdr5", OriginHost: "192.168.1.1", Source: "TEST_QOS_LCR", ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1003", Subject: "1003", Destination: "1004", SetupTime: time.Date(2014, 12, 7, 8, 42, 24, 0, time.UTC), AnswerTime: time.Date(2014, 12, 7, 8, 42, 26, 0, time.UTC), Usage: time.Duration(1) * time.Second, Supplier: "suppl2"} diff --git a/general_tests/tutorial_osips_calls_test.go b/general_tests/tutorial_osips_calls_test.go index 2ee358950..15bbe8445 100644 --- a/general_tests/tutorial_osips_calls_test.go +++ b/general_tests/tutorial_osips_calls_test.go @@ -330,18 +330,18 @@ func TestTutOsipsCalls1001Cdrs(t *testing.T) { if !*testCalls { return } - var reply []*engine.ExternalCdr + var reply []*engine.ExternalCDR var cgrId string // Share with getCostDetails var cCost engine.CallCost - req := utils.RpcCdrsFilter{RunIds: []string{utils.META_DEFAULT}, Accounts: []string{"1001"}, DestPrefixes: []string{"1002"}} + req := utils.RPCCDRsFilter{RunIDs: []string{utils.META_DEFAULT}, Accounts: []string{"1001"}, DestinationPrefixes: []string{"1002"}} if err := tutOsipsCallsRpc.Call("ApierV2.GetCdrs", req, &reply); err != nil { t.Error("Unexpected error: ", err.Error()) } else if len(reply) != 1 { t.Error("Unexpected number of CDRs returned: ", len(reply)) } else { - cgrId = reply[0].CgrId - if reply[0].CdrSource != "OSIPS_E_ACC_EVENT" { - t.Errorf("Unexpected CdrSource for CDR: %+v", reply[0]) + cgrId = reply[0].CGRID + if reply[0].Source != "OSIPS_E_ACC_EVENT" { + t.Errorf("Unexpected Source for CDR: %+v", reply[0]) } if reply[0].ReqType != utils.META_PREPAID { t.Errorf("Unexpected ReqType for CDR: %+v", reply[0]) @@ -363,13 +363,13 @@ func TestTutOsipsCalls1001Cdrs(t *testing.T) { t.Errorf("Unexpected Matched* for CallCost: %+v", cCost.Timespans[0]) } - req = utils.RpcCdrsFilter{RunIds: []string{utils.META_DEFAULT}, Accounts: []string{"1001"}, DestPrefixes: []string{"1003"}} + req = utils.RPCCDRsFilter{RunIDs: []string{utils.META_DEFAULT}, Accounts: []string{"1001"}, DestinationPrefixes: []string{"1003"}} if err := tutOsipsCallsRpc.Call("ApierV2.GetCdrs", req, &reply); err != nil { t.Error("Unexpected error: ", err.Error()) } else if len(reply) != 1 { t.Error("Unexpected number of CDRs returned: ", len(reply)) } else { - cgrId = reply[0].CgrId + cgrId = reply[0].CGRID if reply[0].ReqType != utils.META_PREPAID { t.Errorf("Unexpected ReqType for CDR: %+v", reply[0]) } @@ -386,7 +386,7 @@ func TestTutOsipsCalls1001Cdrs(t *testing.T) { } else if utils.IsSliceMember([]string{cCost.Timespans[0].MatchedSubject, cCost.Timespans[0].MatchedPrefix, cCost.Timespans[0].MatchedDestId}, "") { t.Errorf("Unexpected Matched* for CallCost: %+v", cCost.Timespans[0]) } - req = utils.RpcCdrsFilter{Accounts: []string{"1001"}, RunIds: []string{"derived_run1"}, FilterOnRated: true} + req = utils.RPCCDRsFilter{Accounts: []string{"1001"}, RunIDs: []string{"derived_run1"}} if err := tutOsipsCallsRpc.Call("ApierV2.GetCdrs", req, &reply); err != nil { t.Error("Unexpected error: ", err.Error()) } else if len(reply) != 2 { @@ -407,15 +407,15 @@ func TestTutOsipsCalls1002Cdrs(t *testing.T) { if !*testCalls { return } - var reply []*engine.ExternalCdr - req := utils.RpcCdrsFilter{Accounts: []string{"1002"}, RunIds: []string{utils.META_DEFAULT}} + var reply []*engine.ExternalCDR + req := utils.RPCCDRsFilter{Accounts: []string{"1002"}, RunIDs: []string{utils.META_DEFAULT}} if err := tutOsipsCallsRpc.Call("ApierV2.GetCdrs", req, &reply); err != nil { t.Error("Unexpected error: ", err.Error()) } else if len(reply) != 2 { t.Error("Unexpected number of CDRs returned: ", len(reply)) } else { - if reply[0].CdrSource != "OSIPS_E_ACC_EVENT" { - t.Errorf("Unexpected CdrSource for CDR: %+v", reply[0]) + if reply[0].Source != "OSIPS_E_ACC_EVENT" { + t.Errorf("Unexpected Source for CDR: %+v", reply[0]) } if reply[0].ReqType != utils.META_POSTPAID { t.Errorf("Unexpected ReqType for CDR: %+v", reply[0]) @@ -434,15 +434,15 @@ func TestTutOsipsCalls1003Cdrs(t *testing.T) { if !*testCalls { return } - var reply []*engine.ExternalCdr - req := utils.RpcCdrsFilter{Accounts: []string{"1003"}, RunIds: []string{utils.META_DEFAULT}} + var reply []*engine.ExternalCDR + req := utils.RPCCDRsFilter{Accounts: []string{"1003"}, RunIDs: []string{utils.META_DEFAULT}} if err := tutOsipsCallsRpc.Call("ApierV2.GetCdrs", req, &reply); err != nil { t.Error("Unexpected error: ", err.Error()) } else if len(reply) != 1 { t.Error("Unexpected number of CDRs returned: ", len(reply)) } else { - if reply[0].CdrSource != "OSIPS_E_ACC_EVENT" { - t.Errorf("Unexpected CdrSource for CDR: %+v", reply[0]) + if reply[0].Source != "OSIPS_E_ACC_EVENT" { + t.Errorf("Unexpected Source for CDR: %+v", reply[0]) } if reply[0].ReqType != utils.META_PSEUDOPREPAID { t.Errorf("Unexpected ReqType for CDR: %+v", reply[0]) @@ -462,15 +462,15 @@ func TestTutOsipsCalls1004Cdrs(t *testing.T) { if !*testCalls { return } - var reply []*engine.ExternalCdr - req := utils.RpcCdrsFilter{Accounts: []string{"1004"}, RunIds: []string{utils.META_DEFAULT}} + var reply []*engine.ExternalCDR + req := utils.RPCCDRsFilter{Accounts: []string{"1004"}, RunIDs: []string{utils.META_DEFAULT}} if err := tutOsipsCallsRpc.Call("ApierV2.GetCdrs", req, &reply); err != nil { t.Error("Unexpected error: ", err.Error()) } else if len(reply) != 1 { t.Error("Unexpected number of CDRs returned: ", len(reply)) } else { - if reply[0].CdrSource != "OSIPS_E_ACC_EVENT" { - t.Errorf("Unexpected CdrSource for CDR: %+v", reply[0]) + if reply[0].Source != "OSIPS_E_ACC_EVENT" { + t.Errorf("Unexpected Source for CDR: %+v", reply[0]) } if reply[0].ReqType != utils.META_RATED { t.Errorf("Unexpected ReqType for CDR: %+v", reply[0]) @@ -490,8 +490,8 @@ func TestTutOsipsCalls1006Cdrs(t *testing.T) { if !*testCalls { return } - var reply []*engine.ExternalCdr - req := utils.RpcCdrsFilter{Accounts: []string{"1006"}, RunIds: []string{utils.META_DEFAULT}} + var reply []*engine.ExternalCDR + req := utils.RPCCDRsFilter{Accounts: []string{"1006"}, RunIDs: []string{utils.META_DEFAULT}} if err := tutOsipsCallsRpc.Call("ApierV2.GetCdrs", req, &reply); err != nil { t.Error("Unexpected error: ", err.Error()) } else if len(reply) != 0 { @@ -504,15 +504,15 @@ func TestTutOsipsCalls1007Cdrs(t *testing.T) { if !*testCalls { return } - var reply []*engine.ExternalCdr - req := utils.RpcCdrsFilter{Accounts: []string{"1007"}, RunIds: []string{utils.META_DEFAULT}} + var reply []*engine.ExternalCDR + req := utils.RPCCDRsFilter{Accounts: []string{"1007"}, RunIDs: []string{utils.META_DEFAULT}} if err := tutOsipsCallsRpc.Call("ApierV2.GetCdrs", req, &reply); err != nil { t.Error("Unexpected error: ", err.Error()) } else if len(reply) != 1 { t.Error("Unexpected number of CDRs returned: ", len(reply)) } else { - if reply[0].CdrSource != "OSIPS_E_ACC_EVENT" { - t.Errorf("Unexpected CdrSource for CDR: %+v", reply[0]) + if reply[0].Source != "OSIPS_E_ACC_EVENT" { + t.Errorf("Unexpected Source for CDR: %+v", reply[0]) } if reply[0].ReqType != utils.META_PREPAID { t.Errorf("Unexpected ReqType for CDR: %+v", reply[0]) diff --git a/sessionmanager/fsevent.go b/sessionmanager/fsevent.go index 2b46a8129..3927892fe 100644 --- a/sessionmanager/fsevent.go +++ b/sessionmanager/fsevent.go @@ -182,7 +182,7 @@ func (fsev FSEvent) MissingParameter(timezone string) bool { func (fsev FSEvent) GetSetupTime(fieldName, timezone string) (t time.Time, err error) { fsSTimeStr, hasKey := fsev[SETUP_TIME] if hasKey && fsSTimeStr != "0" { - // Discard the nanoseconds information since MySQL cannot store them in early versions and csv uses default seconds so cgrid will not corelate + // Discard the nanoseconds information since MySQL cannot store them in early versions and csv uses default seconds so CGRID will not corelate fsSTimeStr = fsSTimeStr[:len(fsSTimeStr)-6] } sTimeStr := utils.FirstNonEmpty(fsev[fieldName], fsSTimeStr) @@ -194,7 +194,7 @@ func (fsev FSEvent) GetSetupTime(fieldName, timezone string) (t time.Time, err e func (fsev FSEvent) GetAnswerTime(fieldName, timezone string) (t time.Time, err error) { fsATimeStr, hasKey := fsev[ANSWER_TIME] if hasKey && fsATimeStr != "0" { - // Discard the nanoseconds information since MySQL cannot store them in early versions and csv uses default seconds so cgrid will not corelate + // Discard the nanoseconds information since MySQL cannot store them in early versions and csv uses default seconds so CGRID will not corelate fsATimeStr = fsATimeStr[:len(fsATimeStr)-6] } aTimeStr := utils.FirstNonEmpty(fsev[fieldName], fsATimeStr) @@ -217,18 +217,18 @@ func (fsev FSEvent) GetDuration(fieldName string) (time.Duration, error) { } func (fsev FSEvent) GetPdd(fieldName string) (time.Duration, error) { - var pddStr string + var PDDStr string if utils.IsSliceMember([]string{utils.PDD, utils.META_DEFAULT}, fieldName) { - pddStr = utils.FirstNonEmpty(fsev[PDD_MEDIA_MS], fsev[PDD_NOMEDIA_MS]) - if len(pddStr) != 0 { - pddStr = pddStr + "ms" // PDD is in milliseconds and CGR expects it in seconds + PDDStr = utils.FirstNonEmpty(fsev[PDD_MEDIA_MS], fsev[PDD_NOMEDIA_MS]) + if len(PDDStr) != 0 { + PDDStr = PDDStr + "ms" // PDD is in milliseconds and CGR expects it in seconds } } else if strings.HasPrefix(fieldName, utils.STATIC_VALUE_PREFIX) { // Static value - pddStr = fieldName[len(utils.STATIC_VALUE_PREFIX):] + PDDStr = fieldName[len(utils.STATIC_VALUE_PREFIX):] } else { - pddStr = fsev[fieldName] + PDDStr = fsev[fieldName] } - return utils.ParseDurationWithSecs(pddStr) + return utils.ParseDurationWithSecs(PDDStr) } func (fsev FSEvent) GetSupplier(fieldName string) string { @@ -297,8 +297,8 @@ func (fsev FSEvent) ParseEventValue(rsrFld *utils.RSRField, timezone string) str dur, _ := fsev.GetDuration("") return rsrFld.ParseValue(strconv.FormatInt(dur.Nanoseconds(), 10)) case utils.PDD: - pdd, _ := fsev.GetPdd(utils.META_DEFAULT) - return rsrFld.ParseValue(strconv.FormatFloat(pdd.Seconds(), 'f', -1, 64)) + PDD, _ := fsev.GetPdd(utils.META_DEFAULT) + return rsrFld.ParseValue(strconv.FormatFloat(PDD.Seconds(), 'f', -1, 64)) case utils.SUPPLIER: return rsrFld.ParseValue(fsev.GetSupplier("")) case utils.DISCONNECT_CAUSE: @@ -337,13 +337,13 @@ func (fsev FSEvent) PassesFieldFilter(fieldFilter *utils.RSRField) (bool, string return false, "" } -func (fsev FSEvent) AsStoredCdr(timezone string) *engine.StoredCdr { - storCdr := new(engine.StoredCdr) - storCdr.CgrId = fsev.GetCgrId(timezone) +func (fsev FSEvent) AsStoredCdr(timezone string) *engine.CDR { + storCdr := new(engine.CDR) + storCdr.CGRID = fsev.GetCgrId(timezone) storCdr.TOR = utils.VOICE - storCdr.AccId = fsev.GetUUID() - storCdr.CdrHost = fsev.GetOriginatorIP(utils.META_DEFAULT) - storCdr.CdrSource = "FS_" + fsev.GetName() + storCdr.OriginID = fsev.GetUUID() + storCdr.OriginHost = fsev.GetOriginatorIP(utils.META_DEFAULT) + storCdr.Source = "FS_" + fsev.GetName() storCdr.ReqType = fsev.GetReqType(utils.META_DEFAULT) storCdr.Direction = fsev.GetDirection(utils.META_DEFAULT) storCdr.Tenant = fsev.GetTenant(utils.META_DEFAULT) @@ -354,7 +354,7 @@ func (fsev FSEvent) AsStoredCdr(timezone string) *engine.StoredCdr { storCdr.SetupTime, _ = fsev.GetSetupTime(utils.META_DEFAULT, timezone) storCdr.AnswerTime, _ = fsev.GetAnswerTime(utils.META_DEFAULT, timezone) storCdr.Usage, _ = fsev.GetDuration(utils.META_DEFAULT) - storCdr.Pdd, _ = fsev.GetPdd(utils.META_DEFAULT) + storCdr.PDD, _ = fsev.GetPdd(utils.META_DEFAULT) storCdr.ExtraFields = fsev.GetExtraFields() storCdr.Cost = -1 storCdr.Supplier = fsev.GetSupplier(utils.META_DEFAULT) diff --git a/sessionmanager/fsevent_test.go b/sessionmanager/fsevent_test.go index 30647505c..ec219d1c2 100644 --- a/sessionmanager/fsevent_test.go +++ b/sessionmanager/fsevent_test.go @@ -633,11 +633,12 @@ func TestFsEvAsStoredCdr(t *testing.T) { ev := new(FSEvent).AsEvent(hangupEv) setupTime, _ := utils.ParseTimeDetectLayout("1436280728", "") aTime, _ := utils.ParseTimeDetectLayout("1436280728", "") - eStoredCdr := &engine.StoredCdr{CgrId: "164b0422fdc6a5117031b427439482c6a4f90e41", - TOR: utils.VOICE, AccId: "e3133bf7-dcde-4daf-9663-9a79ffcef5ad", CdrHost: "10.0.3.15", CdrSource: "FS_CHANNEL_HANGUP_COMPLETE", ReqType: utils.META_PREPAID, + eStoredCdr := &engine.CDR{CGRID: "164b0422fdc6a5117031b427439482c6a4f90e41", + TOR: utils.VOICE, OriginID: "e3133bf7-dcde-4daf-9663-9a79ffcef5ad", OriginHost: "10.0.3.15", Source: "FS_CHANNEL_HANGUP_COMPLETE", ReqType: utils.META_PREPAID, Direction: utils.OUT, Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1003", SetupTime: setupTime, AnswerTime: aTime, - Usage: time.Duration(66) * time.Second, Pdd: time.Duration(28) * time.Millisecond, Supplier: "supplier1", DisconnectCause: "NORMAL_CLEARING", ExtraFields: make(map[string]string), Cost: -1} + Usage: time.Duration(66) * time.Second, PDD: time.Duration(28) * time.Millisecond, Supplier: "supplier1", + DisconnectCause: "NORMAL_CLEARING", ExtraFields: make(map[string]string), Cost: -1} if storedCdr := ev.AsStoredCdr(""); !reflect.DeepEqual(eStoredCdr, storedCdr) { t.Errorf("Expecting: %+v, received: %+v", eStoredCdr, storedCdr) } diff --git a/sessionmanager/fssessionmanager.go b/sessionmanager/fssessionmanager.go index 59a04d69e..8c91438d3 100644 --- a/sessionmanager/fssessionmanager.go +++ b/sessionmanager/fssessionmanager.go @@ -292,10 +292,10 @@ func (sm *FSSessionManager) DisconnectSession(ev engine.Event, connId, notify st return nil } -func (sm *FSSessionManager) ProcessCdr(storedCdr *engine.StoredCdr) error { +func (sm *FSSessionManager) ProcessCdr(storedCdr *engine.CDR) error { var reply string if err := sm.cdrsrv.ProcessCdr(storedCdr, &reply); err != nil { - utils.Logger.Err(fmt.Sprintf(" Failed processing CDR, cgrid: %s, accid: %s, error: <%s>", storedCdr.CgrId, storedCdr.AccId, err.Error())) + utils.Logger.Err(fmt.Sprintf(" Failed processing CDR, cgrid: %s, accid: %s, error: <%s>", storedCdr.CGRID, storedCdr.OriginID, err.Error())) } return nil } diff --git a/sessionmanager/kamailiosm.go b/sessionmanager/kamailiosm.go index f6ed04f85..fc5946307 100644 --- a/sessionmanager/kamailiosm.go +++ b/sessionmanager/kamailiosm.go @@ -203,13 +203,13 @@ func (self *KamailioSessionManager) Rater() engine.Connector { return self.rater } -func (self *KamailioSessionManager) ProcessCdr(cdr *engine.StoredCdr) error { +func (self *KamailioSessionManager) ProcessCdr(cdr *engine.CDR) error { if !self.cfg.CreateCdr { return nil } var reply string if err := self.cdrsrv.ProcessCdr(cdr, &reply); err != nil { - utils.Logger.Err(fmt.Sprintf(" Failed processing CDR, cgrid: %s, accid: %s, error: <%s>", cdr.CgrId, cdr.AccId, err.Error())) + utils.Logger.Err(fmt.Sprintf(" Failed processing CDR, cgrid: %s, accid: %s, error: <%s>", cdr.CGRID, cdr.OriginID, err.Error())) } return nil } diff --git a/sessionmanager/kamevent.go b/sessionmanager/kamevent.go index 4c9fe9fde..04aa19cc0 100644 --- a/sessionmanager/kamevent.go +++ b/sessionmanager/kamevent.go @@ -316,13 +316,13 @@ func (kev KamEvent) PassesFieldFilter(*utils.RSRField) (bool, string) { return false, "" } -func (kev KamEvent) AsStoredCdr(timezone string) *engine.StoredCdr { - storCdr := new(engine.StoredCdr) - storCdr.CgrId = kev.GetCgrId(timezone) +func (kev KamEvent) AsStoredCdr(timezone string) *engine.CDR { + storCdr := new(engine.CDR) + storCdr.CGRID = kev.GetCgrId(timezone) storCdr.TOR = utils.VOICE - storCdr.AccId = kev.GetUUID() - storCdr.CdrHost = kev.GetOriginatorIP(utils.META_DEFAULT) - storCdr.CdrSource = kev.GetCdrSource() + storCdr.OriginID = kev.GetUUID() + storCdr.OriginHost = kev.GetOriginatorIP(utils.META_DEFAULT) + storCdr.Source = kev.GetCdrSource() storCdr.ReqType = kev.GetReqType(utils.META_DEFAULT) storCdr.Direction = kev.GetDirection(utils.META_DEFAULT) storCdr.Tenant = kev.GetTenant(utils.META_DEFAULT) @@ -333,7 +333,7 @@ func (kev KamEvent) AsStoredCdr(timezone string) *engine.StoredCdr { storCdr.SetupTime, _ = kev.GetSetupTime(utils.META_DEFAULT, timezone) storCdr.AnswerTime, _ = kev.GetAnswerTime(utils.META_DEFAULT, timezone) storCdr.Usage, _ = kev.GetDuration(utils.META_DEFAULT) - storCdr.Pdd, _ = kev.GetPdd(utils.META_DEFAULT) + storCdr.PDD, _ = kev.GetPdd(utils.META_DEFAULT) storCdr.Supplier = kev.GetSupplier(utils.META_DEFAULT) storCdr.DisconnectCause = kev.GetDisconnectCause(utils.META_DEFAULT) storCdr.ExtraFields = kev.GetExtraFields() diff --git a/sessionmanager/osipsevent.go b/sessionmanager/osipsevent.go index 42332eba0..7072507ff 100644 --- a/sessionmanager/osipsevent.go +++ b/sessionmanager/osipsevent.go @@ -264,13 +264,13 @@ func (osipsev *OsipsEvent) DialogId() string { return osipsev.osipsEvent.AttrValues[OSIPS_DIALOG_ID] } -func (osipsEv *OsipsEvent) AsStoredCdr(timezone string) *engine.StoredCdr { - storCdr := new(engine.StoredCdr) - storCdr.CgrId = osipsEv.GetCgrId(timezone) +func (osipsEv *OsipsEvent) AsStoredCdr(timezone string) *engine.CDR { + storCdr := new(engine.CDR) + storCdr.CGRID = osipsEv.GetCgrId(timezone) storCdr.TOR = utils.VOICE - storCdr.AccId = osipsEv.GetUUID() - storCdr.CdrHost = osipsEv.GetOriginatorIP(utils.META_DEFAULT) - storCdr.CdrSource = "OSIPS_" + osipsEv.GetName() + storCdr.OriginID = osipsEv.GetUUID() + storCdr.OriginHost = osipsEv.GetOriginatorIP(utils.META_DEFAULT) + storCdr.Source = "OSIPS_" + osipsEv.GetName() storCdr.ReqType = osipsEv.GetReqType(utils.META_DEFAULT) storCdr.Direction = osipsEv.GetDirection(utils.META_DEFAULT) storCdr.Tenant = osipsEv.GetTenant(utils.META_DEFAULT) @@ -281,7 +281,7 @@ func (osipsEv *OsipsEvent) AsStoredCdr(timezone string) *engine.StoredCdr { storCdr.SetupTime, _ = osipsEv.GetSetupTime(utils.META_DEFAULT, timezone) storCdr.AnswerTime, _ = osipsEv.GetAnswerTime(utils.META_DEFAULT, timezone) storCdr.Usage, _ = osipsEv.GetDuration(utils.META_DEFAULT) - storCdr.Pdd, _ = osipsEv.GetPdd(utils.META_DEFAULT) + storCdr.PDD, _ = osipsEv.GetPdd(utils.META_DEFAULT) storCdr.Supplier = osipsEv.GetSupplier(utils.META_DEFAULT) storCdr.DisconnectCause = osipsEv.GetDisconnectCause(utils.META_DEFAULT) storCdr.ExtraFields = osipsEv.GetExtraFields() diff --git a/sessionmanager/osipsevent_test.go b/sessionmanager/osipsevent_test.go index 59b24c0e3..6d3b81ba0 100644 --- a/sessionmanager/osipsevent_test.go +++ b/sessionmanager/osipsevent_test.go @@ -44,7 +44,7 @@ func TestOsipsEventParseStatic(t *testing.T) { setupTime, _ := osipsEv.GetSetupTime("^2013-12-07 08:42:24", "") answerTime, _ := osipsEv.GetAnswerTime("^2013-12-07 08:42:24", "") dur, _ := osipsEv.GetDuration("^60s") - pdd, _ := osipsEv.GetPdd("^10s") + PDD, _ := osipsEv.GetPdd("^10s") if osipsEv.GetReqType("^test") != "test" || osipsEv.GetDirection("^test") != "test" || osipsEv.GetTenant("^test") != "test" || @@ -55,7 +55,7 @@ func TestOsipsEventParseStatic(t *testing.T) { setupTime != time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC) || answerTime != time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC) || dur != time.Duration(60)*time.Second || - pdd != time.Duration(10)*time.Second || + PDD != time.Duration(10)*time.Second || osipsEv.GetSupplier("^test") != "test" || osipsEv.GetDisconnectCause("^test") != "test" { t.Error("Values out of static not matching", @@ -69,7 +69,7 @@ func TestOsipsEventParseStatic(t *testing.T) { setupTime != time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC), answerTime != time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC), dur != time.Duration(60)*time.Second, - pdd != time.Duration(10)*time.Second, + PDD != time.Duration(10)*time.Second, osipsEv.GetSupplier("^test") != "test", osipsEv.GetDisconnectCause("^test") != "test") } @@ -83,7 +83,7 @@ func TestOsipsEventGetValues(t *testing.T) { answerTime, _ := osipsEv.GetAnswerTime(utils.META_DEFAULT, "") eAnswerTime, _ := utils.ParseTimeDetectLayout("1406370499", "") dur, _ := osipsEv.GetDuration(utils.META_DEFAULT) - pdd, _ := osipsEv.GetPdd(utils.META_DEFAULT) + PDD, _ := osipsEv.GetPdd(utils.META_DEFAULT) endTime, _ := osipsEv.GetEndTime(utils.META_DEFAULT, "") if osipsEv.GetName() != "E_ACC_CDR" || osipsEv.GetCgrId("") != utils.Sha1("ODVkMDI2Mzc2MDY5N2EzODhjNTAzNTdlODhiZjRlYWQ", setupTime.UTC().String()) || @@ -100,7 +100,7 @@ func TestOsipsEventGetValues(t *testing.T) { !answerTime.Equal(eAnswerTime) || !endTime.Equal(eAnswerTime.Add(dur)) || dur != time.Duration(20*time.Second) || - pdd != time.Duration(3)*time.Second || + PDD != time.Duration(3)*time.Second || osipsEv.GetSupplier(utils.META_DEFAULT) != "supplier3" || osipsEv.GetDisconnectCause(utils.META_DEFAULT) != "200" || osipsEv.GetOriginatorIP(utils.META_DEFAULT) != "172.16.254.77" { @@ -119,7 +119,7 @@ func TestOsipsEventGetValues(t *testing.T) { !answerTime.Equal(time.Date(2014, 7, 26, 12, 28, 19, 0, time.Local)), !endTime.Equal(time.Date(2014, 7, 26, 12, 28, 39, 0, time.Local)), dur != time.Duration(20*time.Second), - pdd != time.Duration(3)*time.Second, + PDD != time.Duration(3)*time.Second, osipsEv.GetSupplier(utils.META_DEFAULT) != "supplier3", osipsEv.GetDisconnectCause(utils.META_DEFAULT) != "200", osipsEv.GetOriginatorIP(utils.META_DEFAULT) != "172.16.254.77", @@ -143,12 +143,12 @@ func TestOsipsEventMissingParameter(t *testing.T) { func TestOsipsEventAsStoredCdr(t *testing.T) { setupTime, _ := utils.ParseTimeDetectLayout("1406370492", "") answerTime, _ := utils.ParseTimeDetectLayout("1406370499", "") - eStoredCdr := &engine.StoredCdr{CgrId: utils.Sha1("ODVkMDI2Mzc2MDY5N2EzODhjNTAzNTdlODhiZjRlYWQ", setupTime.UTC().String()), - TOR: utils.VOICE, AccId: "ODVkMDI2Mzc2MDY5N2EzODhjNTAzNTdlODhiZjRlYWQ", CdrHost: "172.16.254.77", CdrSource: "OSIPS_E_ACC_CDR", + eStoredCdr := &engine.CDR{CGRID: utils.Sha1("ODVkMDI2Mzc2MDY5N2EzODhjNTAzNTdlODhiZjRlYWQ", setupTime.UTC().String()), + TOR: utils.VOICE, OriginID: "ODVkMDI2Mzc2MDY5N2EzODhjNTAzNTdlODhiZjRlYWQ", OriginHost: "172.16.254.77", Source: "OSIPS_E_ACC_CDR", ReqType: utils.META_PREPAID, Direction: utils.OUT, Tenant: "itsyscom.com", Category: "call", Account: "dan", Subject: "dan", Destination: "+4986517174963", SetupTime: setupTime, AnswerTime: answerTime, - Usage: time.Duration(20) * time.Second, Pdd: time.Duration(3) * time.Second, Supplier: "supplier3", DisconnectCause: "200", ExtraFields: map[string]string{"extra1": "val1", "extra2": "val2"}, Cost: -1} + Usage: time.Duration(20) * time.Second, PDD: time.Duration(3) * time.Second, Supplier: "supplier3", DisconnectCause: "200", ExtraFields: map[string]string{"extra1": "val1", "extra2": "val2"}, Cost: -1} if storedCdr := osipsEv.AsStoredCdr(""); !reflect.DeepEqual(eStoredCdr, storedCdr) { t.Errorf("Expecting: %+v, received: %+v", eStoredCdr, storedCdr) } @@ -162,8 +162,8 @@ func TestOsipsAccMissedToStoredCdr(t *testing.T) { "cgr_account": "1001", "cgr_destination": "1002", utils.CGR_SUPPLIER: "supplier1", "duration": "", "dialog_id": "3547:277000822", "extra1": "val1", "extra2": "val2"}, OriginatorAddress: addr, }} - eStoredCdr := &engine.StoredCdr{CgrId: utils.Sha1("27b1e6679ad0109b5d756e42bb4c9c28@0:0:0:0:0:0:0:0", setupTime.UTC().String()), - TOR: utils.VOICE, AccId: "27b1e6679ad0109b5d756e42bb4c9c28@0:0:0:0:0:0:0:0", CdrHost: "172.16.254.77", CdrSource: "OSIPS_E_ACC_MISSED_EVENT", + eStoredCdr := &engine.CDR{CGRID: utils.Sha1("27b1e6679ad0109b5d756e42bb4c9c28@0:0:0:0:0:0:0:0", setupTime.UTC().String()), + TOR: utils.VOICE, OriginID: "27b1e6679ad0109b5d756e42bb4c9c28@0:0:0:0:0:0:0:0", OriginHost: "172.16.254.77", Source: "OSIPS_E_ACC_MISSED_EVENT", ReqType: utils.META_PSEUDOPREPAID, Direction: utils.OUT, Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Supplier: "supplier1", DisconnectCause: "404", Destination: "1002", SetupTime: setupTime, AnswerTime: setupTime, Usage: time.Duration(0), ExtraFields: map[string]string{"extra1": "val1", "extra2": "val2"}, Cost: -1} diff --git a/sessionmanager/osipssm.go b/sessionmanager/osipssm.go index 315cf86fc..05f905cdd 100644 --- a/sessionmanager/osipssm.go +++ b/sessionmanager/osipssm.go @@ -150,7 +150,7 @@ func (osm *OsipsSessionManager) Shutdown() error { } // Process the CDR with CDRS component -func (osm *OsipsSessionManager) ProcessCdr(storedCdr *engine.StoredCdr) error { +func (osm *OsipsSessionManager) ProcessCdr(storedCdr *engine.CDR) error { var reply string return osm.cdrsrv.ProcessCdr(storedCdr, &reply) } diff --git a/sessionmanager/session.go b/sessionmanager/session.go index 9fde47fb7..f30bf276b 100644 --- a/sessionmanager/session.go +++ b/sessionmanager/session.go @@ -40,7 +40,7 @@ type Session struct { func (s *Session) GetSessionRun(runid string) *engine.SessionRun { for _, sr := range s.sessionRuns { - if sr.DerivedCharger.RunId == runid { + if sr.DerivedCharger.RunID == runid { return sr } } @@ -236,7 +236,7 @@ func (s *Session) SaveOperations() { err := s.sessionManager.CdrSrv().LogCallCost(&engine.CallCostLog{ CgrId: s.eventStart.GetCgrId(s.sessionManager.Timezone()), Source: utils.SESSION_MANAGER_SOURCE, - RunId: sr.DerivedCharger.RunId, + RunId: sr.DerivedCharger.RunID, CallCost: firstCC, CheckDuplicate: true, }, &reply) @@ -282,7 +282,7 @@ func (s *Session) AsActiveSessions() []*ActiveSession { SMId: "UNKNOWN", } if sessionRun.DerivedCharger != nil { - aSession.RunId = sessionRun.DerivedCharger.RunId + aSession.RunId = sessionRun.DerivedCharger.RunID } if sessionRun.CallDescriptor != nil { aSession.LoopIndex = sessionRun.CallDescriptor.LoopIndex diff --git a/sessionmanager/session_test.go b/sessionmanager/session_test.go index 61fd636d3..34dbf4b05 100644 --- a/sessionmanager/session_test.go +++ b/sessionmanager/session_test.go @@ -95,12 +95,12 @@ func (mc *MockConnector) GetMaxSessionTime(*engine.CallDescriptor, *float64) err func (mc *MockConnector) GetDerivedChargers(*utils.AttrDerivedChargers, *utils.DerivedChargers) error { return nil } -func (mc *MockConnector) GetDerivedMaxSessionTime(*engine.StoredCdr, *float64) error { return nil } -func (mc *MockConnector) GetSessionRuns(*engine.StoredCdr, *[]*engine.SessionRun) error { return nil } -func (mc *MockConnector) ProcessCdr(*engine.StoredCdr, *string) error { return nil } -func (mc *MockConnector) LogCallCost(*engine.CallCostLog, *string) error { return nil } -func (mc *MockConnector) GetLCR(*engine.AttrGetLcr, *engine.LCRCost) error { return nil } -func (mc *MockConnector) GetTimeout(int, *time.Duration) error { return nil } +func (mc *MockConnector) GetDerivedMaxSessionTime(*engine.CDR, *float64) error { return nil } +func (mc *MockConnector) GetSessionRuns(*engine.CDR, *[]*engine.SessionRun) error { return nil } +func (mc *MockConnector) ProcessCdr(*engine.CDR, *string) error { return nil } +func (mc *MockConnector) LogCallCost(*engine.CallCostLog, *string) error { return nil } +func (mc *MockConnector) GetLCR(*engine.AttrGetLcr, *engine.LCRCost) error { return nil } +func (mc *MockConnector) GetTimeout(int, *time.Duration) error { return nil } func TestSessionRefund(t *testing.T) { mc := &MockConnector{} diff --git a/sessionmanager/smg_event.go b/sessionmanager/smg_event.go index 070d4c528..ff22dfb9f 100644 --- a/sessionmanager/smg_event.go +++ b/sessionmanager/smg_event.go @@ -299,13 +299,13 @@ func (self SMGenericEvent) PassesFieldFilter(*utils.RSRField) (bool, string) { return true, "" } -func (self SMGenericEvent) AsStoredCdr(cfg *config.CGRConfig, timezone string) *engine.StoredCdr { - storCdr := engine.NewStoredCdrWithDefaults(cfg) - storCdr.CgrId = self.GetCgrId(timezone) +func (self SMGenericEvent) AsStoredCdr(cfg *config.CGRConfig, timezone string) *engine.CDR { + storCdr := engine.NewCDRWithDefaults(cfg) + storCdr.CGRID = self.GetCgrId(timezone) storCdr.TOR = utils.FirstNonEmpty(self.GetTOR(utils.META_DEFAULT), storCdr.TOR) // Keep default if none in the event - storCdr.AccId = self.GetUUID() - storCdr.CdrHost = self.GetOriginatorIP(utils.META_DEFAULT) - storCdr.CdrSource = self.GetCdrSource() + storCdr.OriginID = self.GetUUID() + storCdr.OriginHost = self.GetOriginatorIP(utils.META_DEFAULT) + storCdr.Source = self.GetCdrSource() storCdr.ReqType = utils.FirstNonEmpty(self.GetReqType(utils.META_DEFAULT), storCdr.ReqType) storCdr.Direction = utils.FirstNonEmpty(self.GetDirection(utils.META_DEFAULT), storCdr.Direction) storCdr.Tenant = utils.FirstNonEmpty(self.GetTenant(utils.META_DEFAULT), storCdr.Tenant) @@ -316,7 +316,7 @@ func (self SMGenericEvent) AsStoredCdr(cfg *config.CGRConfig, timezone string) * storCdr.SetupTime, _ = self.GetSetupTime(utils.META_DEFAULT, timezone) storCdr.AnswerTime, _ = self.GetAnswerTime(utils.META_DEFAULT, timezone) storCdr.Usage, _ = self.GetUsage(utils.META_DEFAULT) - storCdr.Pdd, _ = self.GetPdd(utils.META_DEFAULT) + storCdr.PDD, _ = self.GetPdd(utils.META_DEFAULT) storCdr.Supplier = self.GetSupplier(utils.META_DEFAULT) storCdr.DisconnectCause = self.GetDisconnectCause(utils.META_DEFAULT) storCdr.ExtraFields = self.GetExtraFields() diff --git a/sessionmanager/smg_event_test.go b/sessionmanager/smg_event_test.go index debdd27a9..b024d08d8 100644 --- a/sessionmanager/smg_event_test.go +++ b/sessionmanager/smg_event_test.go @@ -147,11 +147,11 @@ func TestSMGenericEventAsStoredCdr(t *testing.T) { smGev[utils.CDRHOST] = "10.0.3.15" smGev["Extra1"] = "Value1" smGev["Extra2"] = 5 - eStoredCdr := &engine.StoredCdr{CgrId: "0711eaa78e53937f1593dabc08c83ea04a915f2e", - TOR: utils.VOICE, AccId: "12345", CdrHost: "10.0.3.15", CdrSource: "SM_GENERIC_TEST_EVENT", ReqType: utils.META_PREPAID, + eStoredCdr := &engine.CDR{CGRID: "0711eaa78e53937f1593dabc08c83ea04a915f2e", + TOR: utils.VOICE, OriginID: "12345", OriginHost: "10.0.3.15", Source: "SM_GENERIC_TEST_EVENT", ReqType: utils.META_PREPAID, Direction: utils.OUT, Tenant: "cgrates.org", Category: "call", Account: "account1", Subject: "subject1", Destination: "+4986517174963", SetupTime: time.Date(2015, 11, 9, 14, 21, 24, 0, time.UTC), AnswerTime: time.Date(2015, 11, 9, 14, 22, 2, 0, time.UTC), - Usage: time.Duration(83) * time.Second, Pdd: time.Duration(300) * time.Millisecond, Supplier: "supplier1", DisconnectCause: "NORMAL_DISCONNECT", + Usage: time.Duration(83) * time.Second, PDD: time.Duration(300) * time.Millisecond, Supplier: "supplier1", DisconnectCause: "NORMAL_DISCONNECT", ExtraFields: map[string]string{"Extra1": "Value1", "Extra2": "5"}, Cost: -1} if storedCdr := smGev.AsStoredCdr(cfg, "UTC"); !reflect.DeepEqual(eStoredCdr, storedCdr) { t.Errorf("Expecting: %+v, received: %+v", eStoredCdr, storedCdr) diff --git a/sessionmanager/smgeneric.go b/sessionmanager/smgeneric.go index 275107608..62e58a8c8 100644 --- a/sessionmanager/smgeneric.go +++ b/sessionmanager/smgeneric.go @@ -90,7 +90,7 @@ func (self *SMGeneric) sessionStart(evStart SMGenericEvent, connId string) error } stopDebitChan := make(chan struct{}) for _, sessionRun := range sessionRuns { - s := &SMGSession{eventStart: evStart, connId: connId, runId: sessionRun.DerivedCharger.RunId, timezone: self.timezone, + s := &SMGSession{eventStart: evStart, connId: connId, runId: sessionRun.DerivedCharger.RunID, timezone: self.timezone, rater: self.rater, cdrsrv: self.cdrsrv, cd: sessionRun.CallDescriptor} self.indexSession(sessionId, s) if self.cgrCfg.SmGenericConfig.DebitInterval != 0 { diff --git a/utils/apitpdata.go b/utils/apitpdata.go index 72e2d8c7f..144178dfe 100644 --- a/utils/apitpdata.go +++ b/utils/apitpdata.go @@ -611,8 +611,6 @@ type AttrExpFileCdrs struct { Accounts []string // If provided, it will filter account Subjects []string // If provided, it will filter the rating subject DestinationPrefixes []string // If provided, it will filter on destination prefix - RatedAccounts []string // If provided, it will filter ratedaccount - RatedSubjects []string // If provided, it will filter the ratedsubject OrderIdStart int64 // Export from this order identifier OrderIdEnd int64 // Export smaller than this order identifier TimeStart string // If provided, it will represent the starting of the CDRs interval (>=) @@ -623,25 +621,23 @@ type AttrExpFileCdrs struct { Paginator } -func (self *AttrExpFileCdrs) AsCdrsFilter(timezone string) (*CdrsFilter, error) { - cdrFltr := &CdrsFilter{ - CgrIds: self.CgrIds, - RunIds: self.MediationRunIds, - Tors: self.TORs, - CdrHosts: self.CdrHosts, - CdrSources: self.CdrSources, - ReqTypes: self.ReqTypes, - Directions: self.Directions, - Tenants: self.Tenants, - Categories: self.Categories, - Accounts: self.Accounts, - Subjects: self.Subjects, - DestPrefixes: self.DestinationPrefixes, - RatedAccounts: self.RatedAccounts, - RatedSubjects: self.RatedSubjects, - OrderIdStart: self.OrderIdStart, - OrderIdEnd: self.OrderIdEnd, - Paginator: self.Paginator, +func (self *AttrExpFileCdrs) AsCDRsFilter(timezone string) (*CDRsFilter, error) { + cdrFltr := &CDRsFilter{ + CGRIDs: self.CgrIds, + RunIDs: self.MediationRunIds, + TORs: self.TORs, + OriginHosts: self.CdrHosts, + Sources: self.CdrSources, + ReqTypes: self.ReqTypes, + Directions: self.Directions, + Tenants: self.Tenants, + Categories: self.Categories, + Accounts: self.Accounts, + Subjects: self.Subjects, + DestinationPrefixes: self.DestinationPrefixes, + OrderIDStart: self.OrderIdStart, + OrderIDEnd: self.OrderIdEnd, + Paginator: self.Paginator, } if len(self.TimeStart) != 0 { if answerTimeStart, err := ParseTimeDetectLayout(self.TimeStart, timezone); err != nil { @@ -699,25 +695,23 @@ type AttrGetCdrs struct { Paginator } -func (self *AttrGetCdrs) AsCdrsFilter(timezone string) (*CdrsFilter, error) { - cdrFltr := &CdrsFilter{ - CgrIds: self.CgrIds, - RunIds: self.MediationRunIds, - Tors: self.TORs, - CdrHosts: self.CdrHosts, - CdrSources: self.CdrSources, - ReqTypes: self.ReqTypes, - Directions: self.Directions, - Tenants: self.Tenants, - Categories: self.Categories, - Accounts: self.Accounts, - Subjects: self.Subjects, - DestPrefixes: self.DestinationPrefixes, - RatedAccounts: self.RatedAccounts, - RatedSubjects: self.RatedSubjects, - OrderIdStart: self.OrderIdStart, - OrderIdEnd: self.OrderIdEnd, - Paginator: self.Paginator, +func (self *AttrGetCdrs) AsCDRsFilter(timezone string) (*CDRsFilter, error) { + cdrFltr := &CDRsFilter{ + CGRIDs: self.CgrIds, + RunIDs: self.MediationRunIds, + TORs: self.TORs, + OriginHosts: self.CdrHosts, + Sources: self.CdrSources, + ReqTypes: self.ReqTypes, + Directions: self.Directions, + Tenants: self.Tenants, + Categories: self.Categories, + Accounts: self.Accounts, + Subjects: self.Subjects, + DestinationPrefixes: self.DestinationPrefixes, + OrderIDStart: self.OrderIdStart, + OrderIDEnd: self.OrderIdEnd, + Paginator: self.Paginator, } if len(self.TimeStart) != 0 { if answerTimeStart, err := ParseTimeDetectLayout(self.TimeStart, timezone); err != nil { @@ -834,172 +828,159 @@ type ExportedTPStats struct { Compressed bool } -// Filter used in engine.GetStoredCdrs -type CdrsFilter struct { - CgrIds []string // If provided, it will filter based on the cgrids present in list - NotCgrIds []string // Filter specific CgrIds out - RunIds []string // If provided, it will filter on mediation runid - NotRunIds []string // Filter specific runIds out - Tors []string // If provided, filter on TypeOfRecord - NotTors []string // Filter specific TORs out - CdrHosts []string // If provided, it will filter cdrhost - NotCdrHosts []string // Filter out specific cdr hosts - CdrSources []string // If provided, it will filter cdrsource - NotCdrSources []string // Filter out specific CDR sources - ReqTypes []string // If provided, it will fiter reqtype - NotReqTypes []string // Filter out specific request types - Directions []string // If provided, it will fiter direction - NotDirections []string // Filter out specific directions - Tenants []string // If provided, it will filter tenant - NotTenants []string // If provided, it will filter tenant - Categories []string // If provided, it will filter çategory - NotCategories []string // Filter out specific categories - Accounts []string // If provided, it will filter account - NotAccounts []string // Filter out specific Accounts - Subjects []string // If provided, it will filter the rating subject - NotSubjects []string // Filter out specific subjects - DestPrefixes []string // If provided, it will filter on destination prefix - NotDestPrefixes []string // Filter out specific destination prefixes - Suppliers []string // If provided, it will filter the supplier - NotSuppliers []string // Filter out specific suppliers - DisconnectCauses []string // Filter for disconnect Cause - NotDisconnectCauses []string // Filter out specific disconnect causes - RatedAccounts []string // If provided, it will filter ratedaccount - NotRatedAccounts []string // Filter out specific RatedAccounts - RatedSubjects []string // If provided, it will filter the ratedsubject - NotRatedSubjects []string // Filter out specific RatedSubjects - Costs []float64 // Query based on costs specified - NotCosts []float64 // Filter out specific costs out from result - ExtraFields map[string]string // Query based on extra fields content - NotExtraFields map[string]string // Filter out based on extra fields content - OrderIdStart int64 // Export from this order identifier - OrderIdEnd int64 // Export smaller than this order identifier - SetupTimeStart *time.Time // Start of interval, bigger or equal than configured - SetupTimeEnd *time.Time // End interval, smaller than setupTime - AnswerTimeStart *time.Time // Start of interval, bigger or equal than configured - AnswerTimeEnd *time.Time // End interval, smaller than answerTime - CreatedAtStart *time.Time // Start of interval, bigger or equal than configured - CreatedAtEnd *time.Time // End interval, smaller than - UpdatedAtStart *time.Time // Start of interval, bigger or equal than configured - UpdatedAtEnd *time.Time // End interval, smaller than - MinUsage *float64 // Start of the usage interval (>=) - MaxUsage *float64 // End of the usage interval (<) - MinPdd *float64 // Start of the pdd interval (>=) - MaxPdd *float64 // End of the pdd interval (<) - MinCost *float64 // Start of the cost interval (>=) - MaxCost *float64 // End of the usage interval (<) - FilterOnRated bool // Do not consider rated CDRs but raw one - Unscoped bool // Include soft-deleted records in results - Count bool // If true count the items instead of returning data +// CDRsFilter is a filter used to get records out of storDB +type CDRsFilter struct { + CGRIDs []string // If provided, it will filter based on the cgrids present in list + NotCGRIDs []string // Filter specific CgrIds out + RunIDs []string // If provided, it will filter on mediation runid + NotRunIDs []string // Filter specific runIds out + OriginHosts []string // If provided, it will filter cdrhost + NotOriginHosts []string // Filter out specific cdr hosts + Sources []string // If provided, it will filter cdrsource + NotSources []string // Filter out specific CDR sources + TORs []string // If provided, filter on TypeOfRecord + NotTORs []string // Filter specific TORs out + ReqTypes []string // If provided, it will fiter reqtype + NotReqTypes []string // Filter out specific request types + Directions []string // If provided, it will fiter direction + NotDirections []string // Filter out specific directions + Tenants []string // If provided, it will filter tenant + NotTenants []string // If provided, it will filter tenant + Categories []string // If provided, it will filter çategory + NotCategories []string // Filter out specific categories + Accounts []string // If provided, it will filter account + NotAccounts []string // Filter out specific Accounts + Subjects []string // If provided, it will filter the rating subject + NotSubjects []string // Filter out specific subjects + DestinationPrefixes []string // If provided, it will filter on destination prefix + NotDestinationPrefixes []string // Filter out specific destination prefixes + Suppliers []string // If provided, it will filter the supplier + NotSuppliers []string // Filter out specific suppliers + DisconnectCauses []string // Filter for disconnect Cause + NotDisconnectCauses []string // Filter out specific disconnect causes + Costs []float64 // Query based on costs specified + NotCosts []float64 // Filter out specific costs out from result + ExtraFields map[string]string // Query based on extra fields content + NotExtraFields map[string]string // Filter out based on extra fields content + OrderIDStart int64 // Export from this order identifier + OrderIDEnd int64 // Export smaller than this order identifier + SetupTimeStart *time.Time // Start of interval, bigger or equal than configured + SetupTimeEnd *time.Time // End interval, smaller than setupTime + AnswerTimeStart *time.Time // Start of interval, bigger or equal than configured + AnswerTimeEnd *time.Time // End interval, smaller than answerTime + CreatedAtStart *time.Time // Start of interval, bigger or equal than configured + CreatedAtEnd *time.Time // End interval, smaller than + UpdatedAtStart *time.Time // Start of interval, bigger or equal than configured + UpdatedAtEnd *time.Time // End interval, smaller than + MinUsage *float64 // Start of the usage interval (>=) + MaxUsage *float64 // End of the usage interval (<) + MinPDD *float64 // Start of the pdd interval (>=) + MaxPDD *float64 // End of the pdd interval (<) + MinCost *float64 // Start of the cost interval (>=) + MaxCost *float64 // End of the usage interval (<) + FilterOnRated bool // Do not consider rated CDRs but raw one + Unscoped bool // Include soft-deleted records in results + Count bool // If true count the items instead of returning data Paginator } -// Used in Rpc calls, slightly different than CdrsFilter by using string instead of Time filters -type RpcCdrsFilter struct { - CgrIds []string // If provided, it will filter based on the cgrids present in list - NotCgrIds []string // Filter specific CgrIds out - RunIds []string // If provided, it will filter on mediation runid - NotRunIds []string // Filter specific runIds out - Tors []string // If provided, filter on TypeOfRecord - NotTors []string // Filter specific TORs out - CdrHosts []string // If provided, it will filter cdrhost - NotCdrHosts []string // Filter out specific cdr hosts - CdrSources []string // If provided, it will filter cdrsource - NotCdrSources []string // Filter out specific CDR sources - ReqTypes []string // If provided, it will fiter reqtype - NotReqTypes []string // Filter out specific request types - Directions []string // If provided, it will fiter direction - NotDirections []string // Filter out specific directions - Tenants []string // If provided, it will filter tenant - NotTenants []string // If provided, it will filter tenant - Categories []string // If provided, it will filter çategory - NotCategories []string // Filter out specific categories - Accounts []string // If provided, it will filter account - NotAccounts []string // Filter out specific Accounts - Subjects []string // If provided, it will filter the rating subject - NotSubjects []string // Filter out specific subjects - DestPrefixes []string // If provided, it will filter on destination prefix - NotDestPrefixes []string // Filter out specific destination prefixes - Suppliers []string // If provided, it will filter the supplier - NotSuppliers []string // Filter out specific suppliers - DisconnectCauses []string // Filter for disconnect Cause - NotDisconnectCauses []string // Filter out specific disconnect causes - RatedAccounts []string // If provided, it will filter ratedaccount - NotRatedAccounts []string // Filter out specific RatedAccounts - RatedSubjects []string // If provided, it will filter the ratedsubject - NotRatedSubjects []string // Filter out specific RatedSubjects - Costs []float64 // Query based on costs specified - NotCosts []float64 // Filter out specific costs out from result - ExtraFields map[string]string // Query based on extra fields content - NotExtraFields map[string]string // Filter out based on extra fields content - OrderIdStart int64 // Export from this order identifier - OrderIdEnd int64 // Export smaller than this order identifier - SetupTimeStart string // Start of interval, bigger or equal than configured - SetupTimeEnd string // End interval, smaller than setupTime - AnswerTimeStart string // Start of interval, bigger or equal than configured - AnswerTimeEnd string // End interval, smaller than answerTime - CreatedAtStart string // Start of interval, bigger or equal than configured - CreatedAtEnd string // End interval, smaller than - UpdatedAtStart string // Start of interval, bigger or equal than configured - UpdatedAtEnd string // End interval, smaller than - MinUsage *float64 // Start of the usage interval (>=) - MaxUsage *float64 // End of the usage interval (<) - MinPdd *float64 // Start of the pdd interval (>=) - MaxPdd *float64 // End of the pdd interval (<) - MinCost *float64 // Start of the cost interval (>=) - MaxCost *float64 // End of the usage interval (<) - FilterOnRated bool // Do not consider derived CDRs but original one - Paginator // Add pagination +// RPCCDRsFilter is a filter used in Rpc calls +// RPCCDRsFilter is slightly different than CDRsFilter by using string instead of Time filters +type RPCCDRsFilter struct { + CGRIDs []string // If provided, it will filter based on the cgrids present in list + NotCGRIDs []string // Filter specific CgrIds out + RunIDs []string // If provided, it will filter on mediation runid + NotRunIDs []string // Filter specific runIds out + OriginHosts []string // If provided, it will filter cdrhost + NotOriginHosts []string // Filter out specific cdr hosts + Sources []string // If provided, it will filter cdrsource + NotSources []string // Filter out specific CDR sources + TORs []string // If provided, filter on TypeOfRecord + NotTORs []string // Filter specific TORs out + ReqTypes []string // If provided, it will fiter reqtype + NotReqTypes []string // Filter out specific request types + Directions []string // If provided, it will fiter direction + NotDirections []string // Filter out specific directions + Tenants []string // If provided, it will filter tenant + NotTenants []string // If provided, it will filter tenant + Categories []string // If provided, it will filter çategory + NotCategories []string // Filter out specific categories + Accounts []string // If provided, it will filter account + NotAccounts []string // Filter out specific Accounts + Subjects []string // If provided, it will filter the rating subject + NotSubjects []string // Filter out specific subjects + DestinationPrefixes []string // If provided, it will filter on destination prefix + NotDestinationPrefixes []string // Filter out specific destination prefixes + Suppliers []string // If provided, it will filter the supplier + NotSuppliers []string // Filter out specific suppliers + DisconnectCauses []string // Filter for disconnect Cause + NotDisconnectCauses []string // Filter out specific disconnect causes + Costs []float64 // Query based on costs specified + NotCosts []float64 // Filter out specific costs out from result + ExtraFields map[string]string // Query based on extra fields content + NotExtraFields map[string]string // Filter out based on extra fields content + OrderIDStart int64 // Export from this order identifier + OrderIDEnd int64 // Export smaller than this order identifier + SetupTimeStart string // Start of interval, bigger or equal than configured + SetupTimeEnd string // End interval, smaller than setupTime + AnswerTimeStart string // Start of interval, bigger or equal than configured + AnswerTimeEnd string // End interval, smaller than answerTime + CreatedAtStart string // Start of interval, bigger or equal than configured + CreatedAtEnd string // End interval, smaller than + UpdatedAtStart string // Start of interval, bigger or equal than configured + UpdatedAtEnd string // End interval, smaller than + MinUsage *float64 // Start of the usage interval (>=) + MaxUsage *float64 // End of the usage interval (<) + MinPDD *float64 // Start of the pdd interval (>=) + MaxPDD *float64 // End of the pdd interval (<) + MinCost *float64 // Start of the cost interval (>=) + MaxCost *float64 // End of the usage interval (<) + Paginator // Add pagination } -func (self *RpcCdrsFilter) AsCdrsFilter(timezone string) (*CdrsFilter, error) { - cdrFltr := &CdrsFilter{ - CgrIds: self.CgrIds, - NotCgrIds: self.NotCgrIds, - RunIds: self.RunIds, - NotRunIds: self.NotRunIds, - Tors: self.Tors, - NotTors: self.NotTors, - CdrHosts: self.CdrHosts, - NotCdrHosts: self.NotCdrHosts, - CdrSources: self.CdrSources, - NotCdrSources: self.NotCdrSources, - ReqTypes: self.ReqTypes, - NotReqTypes: self.NotReqTypes, - Directions: self.Directions, - NotDirections: self.NotDirections, - Tenants: self.Tenants, - NotTenants: self.NotTenants, - Categories: self.Categories, - NotCategories: self.NotCategories, - Accounts: self.Accounts, - NotAccounts: self.NotAccounts, - Subjects: self.Subjects, - NotSubjects: self.NotSubjects, - DestPrefixes: self.DestPrefixes, - NotDestPrefixes: self.NotDestPrefixes, - Suppliers: self.Suppliers, - NotSuppliers: self.NotSuppliers, - DisconnectCauses: self.DisconnectCauses, - NotDisconnectCauses: self.NotDisconnectCauses, - RatedAccounts: self.RatedAccounts, - NotRatedAccounts: self.NotRatedAccounts, - RatedSubjects: self.RatedSubjects, - NotRatedSubjects: self.NotRatedSubjects, - Costs: self.Costs, - NotCosts: self.NotCosts, - ExtraFields: self.ExtraFields, - NotExtraFields: self.NotExtraFields, - OrderIdStart: self.OrderIdStart, - OrderIdEnd: self.OrderIdEnd, - MinUsage: self.MinUsage, - MaxUsage: self.MaxUsage, - MinPdd: self.MinPdd, - MaxPdd: self.MaxPdd, - MinCost: self.MinCost, - MaxCost: self.MaxCost, - FilterOnRated: self.FilterOnRated, - Paginator: self.Paginator, +func (self *RPCCDRsFilter) AsCDRsFilter(timezone string) (*CDRsFilter, error) { + cdrFltr := &CDRsFilter{ + CGRIDs: self.CGRIDs, + NotCGRIDs: self.NotCGRIDs, + RunIDs: self.RunIDs, + NotRunIDs: self.NotRunIDs, + TORs: self.TORs, + NotTORs: self.NotTORs, + OriginHosts: self.OriginHosts, + NotOriginHosts: self.NotOriginHosts, + Sources: self.Sources, + NotSources: self.NotSources, + ReqTypes: self.ReqTypes, + NotReqTypes: self.NotReqTypes, + Directions: self.Directions, + NotDirections: self.NotDirections, + Tenants: self.Tenants, + NotTenants: self.NotTenants, + Categories: self.Categories, + NotCategories: self.NotCategories, + Accounts: self.Accounts, + NotAccounts: self.NotAccounts, + Subjects: self.Subjects, + NotSubjects: self.NotSubjects, + DestinationPrefixes: self.DestinationPrefixes, + NotDestinationPrefixes: self.NotDestinationPrefixes, + Suppliers: self.Suppliers, + NotSuppliers: self.NotSuppliers, + DisconnectCauses: self.DisconnectCauses, + NotDisconnectCauses: self.NotDisconnectCauses, + Costs: self.Costs, + NotCosts: self.NotCosts, + ExtraFields: self.ExtraFields, + NotExtraFields: self.NotExtraFields, + OrderIDStart: self.OrderIDStart, + OrderIDEnd: self.OrderIDEnd, + MinUsage: self.MinUsage, + MaxUsage: self.MaxUsage, + MinPDD: self.MinPDD, + MaxPDD: self.MaxPDD, + MinCost: self.MinCost, + MaxCost: self.MaxCost, + Paginator: self.Paginator, } if len(self.SetupTimeStart) != 0 { if sTimeStart, err := ParseTimeDetectLayout(self.SetupTimeStart, timezone); err != nil { @@ -1063,20 +1044,20 @@ func (self *RpcCdrsFilter) AsCdrsFilter(timezone string) (*CdrsFilter, error) { type AttrExportCdrsToFile struct { CdrFormat *string // Cdr output file format FieldSeparator *string // Separator used between fields - ExportId *string // Optional exportid - ExportDir *string // If provided it overwrites the configured export directory + ExportID *string // Optional exportid + ExportFolder *string // If provided it overwrites the configured export directory ExportFileName *string // If provided the output filename will be set to this ExportTemplate *string // Exported fields template <""|fld1,fld2|*xml:instance_name> DataUsageMultiplyFactor *float64 // Multiply data usage before export (eg: convert from KBytes to Bytes) - SmsUsageMultiplyFactor *float64 // Multiply sms usage before export (eg: convert from SMS unit to call duration for some billing systems) + SMSUsageMultiplyFactor *float64 // Multiply sms usage before export (eg: convert from SMS unit to call duration for some billing systems) GenericUsageMultiplyFactor *float64 // Multiply generic usage before export (eg: convert from GENERIC unit to call duration for some billing systems) CostMultiplyFactor *float64 // Multiply the cost before export, eg: apply VAT CostShiftDigits *int // If defined it will shift cost digits before applying rouding (eg: convert from Eur->cents), -1 to use general config ones RoundDecimals *int // Overwrite configured roundDecimals with this dynamically, -1 to use general config ones - MaskDestinationId *string // Overwrite configured MaskDestId + MaskDestinationID *string // Overwrite configured MaskDestId MaskLength *int // Overwrite configured MaskLength, -1 to use general config ones - SuppressCgrIds bool // Disable CgrIds reporting in reply/ExportedCgrIds and reply/UnexportedCgrIds - RpcCdrsFilter // Inherit the CDR filter attributes + Verbose bool // Disable CgrIds reporting in reply/ExportedCgrIds and reply/UnexportedCgrIds + RPCCDRsFilter // Inherit the CDR filter attributes } type AttrSetActions struct { diff --git a/utils/consts.go b/utils/consts.go index 0776a9173..f27f64390 100644 --- a/utils/consts.go +++ b/utils/consts.go @@ -106,12 +106,12 @@ const ( GOB = "gob" MSGPACK = "msgpack" CSV_LOAD = "CSVLOAD" - CGRID = "CgrId" + CGRID = "CGRID" TOR = "TOR" - ORDERID = "OrderId" - ACCID = "AccId" - CDRHOST = "CdrHost" - CDRSOURCE = "CdrSource" + ORDERID = "OrderID" + ACCID = "OriginID" + CDRSOURCE = "Source" + CDRHOST = "OriginHost" REQTYPE = "ReqType" DIRECTION = "Direction" TENANT = "Tenant" @@ -122,11 +122,9 @@ const ( SETUP_TIME = "SetupTime" ANSWER_TIME = "AnswerTime" USAGE = "Usage" - PDD = "Pdd" + PDD = "PDD" SUPPLIER = "Supplier" - MEDI_RUNID = "MediationRunId" - RATED_ACCOUNT = "RatedAccount" - RATED_SUBJECT = "RatedSubject" + MEDI_RUNID = "RunID" COST = "Cost" COST_DETAILS = "CostDetails" RATED = "rated" @@ -263,6 +261,6 @@ const ( var ( CdreCdrFormats = []string{CSV, DRYRUN, CDRE_FIXED_WIDTH} - PrimaryCdrFields = []string{CGRID, TOR, ACCID, CDRHOST, CDRSOURCE, REQTYPE, DIRECTION, TENANT, CATEGORY, ACCOUNT, SUBJECT, DESTINATION, SETUP_TIME, PDD, ANSWER_TIME, USAGE, + PrimaryCdrFields = []string{CGRID, CDRSOURCE, CDRHOST, ACCID, TOR, REQTYPE, DIRECTION, TENANT, CATEGORY, ACCOUNT, SUBJECT, DESTINATION, SETUP_TIME, PDD, ANSWER_TIME, USAGE, SUPPLIER, DISCONNECT_CAUSE, COST, RATED} ) diff --git a/utils/derivedchargers.go b/utils/derivedchargers.go index 5d9d8def8..62f05ae58 100644 --- a/utils/derivedchargers.go +++ b/utils/derivedchargers.go @@ -29,7 +29,7 @@ func NewDerivedCharger(runId, runFilters, reqTypeFld, dirFld, tenantFld, catFld, if len(runId) == 0 { return nil, errors.New("Empty run id field") } - dc = &DerivedCharger{RunId: runId} + dc = &DerivedCharger{RunID: runId} dc.RunFilters = runFilters if strings.HasPrefix(dc.RunFilters, REGEXP_PREFIX) || strings.HasPrefix(dc.RunFilters, STATIC_VALUE_PREFIX) { if dc.rsrRunFilters, err = ParseRSRFields(dc.RunFilters, INFIELD_SEP); err != nil { @@ -84,9 +84,9 @@ func NewDerivedCharger(runId, runFilters, reqTypeFld, dirFld, tenantFld, catFld, return nil, err } } - dc.PddField = pddFld - if strings.HasPrefix(dc.PddField, REGEXP_PREFIX) || strings.HasPrefix(dc.PddField, STATIC_VALUE_PREFIX) { - if dc.rsrPddField, err = NewRSRField(dc.PddField); err != nil { + dc.PDDField = pddFld + if strings.HasPrefix(dc.PDDField, REGEXP_PREFIX) || strings.HasPrefix(dc.PDDField, STATIC_VALUE_PREFIX) { + if dc.rsrPddField, err = NewRSRField(dc.PDDField); err != nil { return nil, err } } @@ -130,7 +130,7 @@ func NewDerivedCharger(runId, runFilters, reqTypeFld, dirFld, tenantFld, catFld, } type DerivedCharger struct { - RunId string // Unique runId in the chain + RunID string // Unique runId in the chain RunFilters string // Only run the charger if all the filters match ReqTypeField string // Field containing request type info, number in case of csv source, '^' as prefix in case of static values DirectionField string // Field containing direction info @@ -140,7 +140,7 @@ type DerivedCharger struct { SubjectField string // Field containing subject information DestinationField string // Field containing destination information SetupTimeField string // Field containing setup time information - PddField string // Field containing setup time information + PDDField string // Field containing setup time information AnswerTimeField string // Field containing answer time information UsageField string // Field containing usage information SupplierField string // Field containing supplier information @@ -166,7 +166,7 @@ type DerivedCharger struct { } func (dc *DerivedCharger) Equal(other *DerivedCharger) bool { - return dc.RunId == other.RunId && + return dc.RunID == other.RunID && dc.RunFilters == other.RunFilters && dc.ReqTypeField == other.ReqTypeField && dc.DirectionField == other.DirectionField && @@ -176,7 +176,7 @@ func (dc *DerivedCharger) Equal(other *DerivedCharger) bool { dc.SubjectField == other.SubjectField && dc.DestinationField == other.DestinationField && dc.SetupTimeField == other.SetupTimeField && - dc.PddField == other.PddField && + dc.PDDField == other.PDDField && dc.AnswerTimeField == other.AnswerTimeField && dc.UsageField == other.UsageField && dc.SupplierField == other.SupplierField && @@ -190,17 +190,17 @@ func DerivedChargersKey(direction, tenant, category, account, subject string) st } type DerivedChargers struct { - DestinationIds StringMap + DestinationIDs StringMap Chargers []*DerivedCharger } // Precheck that RunId is unique func (dcs *DerivedChargers) Append(dc *DerivedCharger) (*DerivedChargers, error) { - if dc.RunId == DEFAULT_RUNID { + if dc.RunID == DEFAULT_RUNID { return nil, errors.New("Reserved RunId") } for _, dcLocal := range dcs.Chargers { - if dcLocal.RunId == dc.RunId { + if dcLocal.RunID == dc.RunID { return nil, errors.New("Duplicated RunId") } } @@ -216,7 +216,7 @@ func (dcs *DerivedChargers) AppendDefaultRun() (*DerivedChargers, error) { } func (dcs *DerivedChargers) Equal(other *DerivedChargers) bool { - dcs.DestinationIds.Equal(other.DestinationIds) + dcs.DestinationIDs.Equal(other.DestinationIDs) for i, dc := range dcs.Chargers { if !dc.Equal(other.Chargers[i]) { return false diff --git a/utils/derivedchargers_test.go b/utils/derivedchargers_test.go index 4a2fffe31..5d4d7040d 100644 --- a/utils/derivedchargers_test.go +++ b/utils/derivedchargers_test.go @@ -27,27 +27,27 @@ func TestAppendDerivedChargers(t *testing.T) { var err error dcs := &DerivedChargers{Chargers: make([]*DerivedCharger, 0)} - if _, err := dcs.Append(&DerivedCharger{RunId: DEFAULT_RUNID}); err == nil { - t.Error("Failed to detect using of the default runid") + if _, err := dcs.Append(&DerivedCharger{RunID: DEFAULT_RUNID}); err == nil { + t.Error("Failed to detect using of the default RunID") } - if dcs, err = dcs.Append(&DerivedCharger{RunId: "FIRST_RUNID"}); err != nil { - t.Error("Failed to add runid") + if dcs, err = dcs.Append(&DerivedCharger{RunID: "FIRST_RunID"}); err != nil { + t.Error("Failed to add RunID") } else if len(dcs.Chargers) != 1 { t.Error("Unexpected number of items inside DerivedChargers configuration", len(dcs.Chargers)) } - if dcs, err = dcs.Append(&DerivedCharger{RunId: "SECOND_RUNID"}); err != nil { - t.Error("Failed to add runid") + if dcs, err = dcs.Append(&DerivedCharger{RunID: "SECOND_RunID"}); err != nil { + t.Error("Failed to add RunID") } else if len(dcs.Chargers) != 2 { t.Error("Unexpected number of items inside DerivedChargers configuration", len(dcs.Chargers)) } - if _, err := dcs.Append(&DerivedCharger{RunId: "SECOND_RUNID"}); err == nil { - t.Error("Failed to detect duplicate runid") + if _, err := dcs.Append(&DerivedCharger{RunID: "SECOND_RunID"}); err == nil { + t.Error("Failed to detect duplicate RunID") } } func TestNewDerivedCharger(t *testing.T) { edc1 := &DerivedCharger{ - RunId: "test1", + RunID: "test1", RunFilters: "", ReqTypeField: "reqtype1", DirectionField: "direction1", @@ -57,7 +57,7 @@ func TestNewDerivedCharger(t *testing.T) { SubjectField: "subject1", DestinationField: "destination1", SetupTimeField: "setuptime1", - PddField: "pdd1", + PDDField: "pdd1", AnswerTimeField: "answertime1", UsageField: "duration1", SupplierField: "supplier1", @@ -72,7 +72,7 @@ func TestNewDerivedCharger(t *testing.T) { t.Errorf("Expecting: %v, received: %v", edc1, dc1) } edc2 := &DerivedCharger{ - RunId: "test2", + RunID: "test2", RunFilters: "^cdr_source/tdm_cdrs/", ReqTypeField: "~reqtype2:s/sip:(.+)/$1/", DirectionField: "~direction2:s/sip:(.+)/$1/", @@ -82,7 +82,7 @@ func TestNewDerivedCharger(t *testing.T) { SubjectField: "~subject2:s/sip:(.+)/$1/", DestinationField: "~destination2:s/sip:(.+)/$1/", SetupTimeField: "~setuptime2:s/sip:(.+)/$1/", - PddField: "~pdd:s/sip:(.+)/$1/", + PDDField: "~pdd:s/sip:(.+)/$1/", AnswerTimeField: "~answertime2:s/sip:(.+)/$1/", UsageField: "~duration2:s/sip:(.+)/$1/", SupplierField: "~supplier2:s/(.+)/$1/", @@ -137,20 +137,20 @@ func TestDerivedChargersKey(t *testing.T) { func TestAppendDefaultRun(t *testing.T) { dc1 := &DerivedChargers{} - dcDf := &DerivedCharger{RunId: DEFAULT_RUNID, RunFilters: "", ReqTypeField: META_DEFAULT, DirectionField: META_DEFAULT, + dcDf := &DerivedCharger{RunID: DEFAULT_RUNID, RunFilters: "", ReqTypeField: META_DEFAULT, DirectionField: META_DEFAULT, TenantField: META_DEFAULT, CategoryField: META_DEFAULT, AccountField: META_DEFAULT, SubjectField: META_DEFAULT, - DestinationField: META_DEFAULT, SetupTimeField: META_DEFAULT, PddField: META_DEFAULT, AnswerTimeField: META_DEFAULT, UsageField: META_DEFAULT, SupplierField: META_DEFAULT, + DestinationField: META_DEFAULT, SetupTimeField: META_DEFAULT, PDDField: META_DEFAULT, AnswerTimeField: META_DEFAULT, UsageField: META_DEFAULT, SupplierField: META_DEFAULT, DisconnectCauseField: META_DEFAULT, CostField: META_DEFAULT, RatedField: META_DEFAULT} eDc1 := &DerivedChargers{Chargers: []*DerivedCharger{dcDf}} if dc1, _ = dc1.AppendDefaultRun(); !reflect.DeepEqual(dc1, eDc1) { t.Errorf("Expecting: %+v, received: %+v", eDc1.Chargers[0], dc1.Chargers[0]) } dc2 := &DerivedChargers{Chargers: []*DerivedCharger{ - &DerivedCharger{RunId: "extra1", RunFilters: "", ReqTypeField: "reqtype2", DirectionField: META_DEFAULT, TenantField: META_DEFAULT, CategoryField: META_DEFAULT, - AccountField: "rif", SubjectField: "rif", DestinationField: META_DEFAULT, SetupTimeField: META_DEFAULT, PddField: META_DEFAULT, AnswerTimeField: META_DEFAULT, UsageField: META_DEFAULT, + &DerivedCharger{RunID: "extra1", RunFilters: "", ReqTypeField: "reqtype2", DirectionField: META_DEFAULT, TenantField: META_DEFAULT, CategoryField: META_DEFAULT, + AccountField: "rif", SubjectField: "rif", DestinationField: META_DEFAULT, SetupTimeField: META_DEFAULT, PDDField: META_DEFAULT, AnswerTimeField: META_DEFAULT, UsageField: META_DEFAULT, DisconnectCauseField: META_DEFAULT}, - &DerivedCharger{RunId: "extra2", ReqTypeField: META_DEFAULT, DirectionField: META_DEFAULT, TenantField: META_DEFAULT, CategoryField: META_DEFAULT, - AccountField: "ivo", SubjectField: "ivo", DestinationField: META_DEFAULT, SetupTimeField: META_DEFAULT, PddField: META_DEFAULT, AnswerTimeField: META_DEFAULT, + &DerivedCharger{RunID: "extra2", ReqTypeField: META_DEFAULT, DirectionField: META_DEFAULT, TenantField: META_DEFAULT, CategoryField: META_DEFAULT, + AccountField: "ivo", SubjectField: "ivo", DestinationField: META_DEFAULT, SetupTimeField: META_DEFAULT, PDDField: META_DEFAULT, AnswerTimeField: META_DEFAULT, UsageField: META_DEFAULT, SupplierField: META_DEFAULT, DisconnectCauseField: META_DEFAULT}}, } eDc2 := &DerivedChargers{}