From 0dc91e2981ca362229c98837caf9983039159086 Mon Sep 17 00:00:00 2001 From: DanB Date: Mon, 20 Jul 2015 21:42:24 +0200 Subject: [PATCH] Make sure cdr_http field is replicable with cost and cgrid, fixes #124 --- engine/cgrcdr.go | 12 ++++++++++++ engine/cgrcdr_test.go | 34 ++++++++++++++++++++++++++++++++++ utils/consts.go | 3 ++- 3 files changed, 48 insertions(+), 1 deletion(-) diff --git a/engine/cgrcdr.go b/engine/cgrcdr.go index 55cbf73db..d3a33de13 100644 --- a/engine/cgrcdr.go +++ b/engine/cgrcdr.go @@ -21,6 +21,7 @@ package engine import ( "github.com/cgrates/cgrates/utils" "net/http" + "strconv" ) func NewCgrCdrFromHttpReq(req *http.Request) (CgrCdr, error) { @@ -40,6 +41,9 @@ func NewCgrCdrFromHttpReq(req *http.Request) (CgrCdr, error) { type CgrCdr map[string]string func (cgrCdr CgrCdr) getCgrId() string { + if cgrId, hasIt := cgrCdr[utils.CGRID]; hasIt { + return cgrId + } setupTime, _ := utils.ParseTimeDetectLayout(cgrCdr[utils.SETUP_TIME]) return utils.Sha1(cgrCdr[utils.ACCID], setupTime.UTC().String()) } @@ -69,10 +73,18 @@ func (cgrCdr CgrCdr) AsStoredCdr() *StoredCdr { storCdr.Subject = cgrCdr[utils.SUBJECT] storCdr.Destination = cgrCdr[utils.DESTINATION] storCdr.SetupTime, _ = utils.ParseTimeDetectLayout(cgrCdr[utils.SETUP_TIME]) // Not interested to process errors, should do them if necessary in a previous step + storCdr.Pdd, _ = utils.ParseDurationWithSecs(cgrCdr[utils.PDD]) storCdr.AnswerTime, _ = utils.ParseTimeDetectLayout(cgrCdr[utils.ANSWER_TIME]) storCdr.Usage, _ = utils.ParseDurationWithSecs(cgrCdr[utils.USAGE]) storCdr.Supplier = cgrCdr[utils.SUPPLIER] + storCdr.DisconnectCause = cgrCdr[utils.DISCONNECT_CAUSE] storCdr.ExtraFields = cgrCdr.getExtraFields() storCdr.Cost = -1 + if costStr, hasIt := cgrCdr[utils.COST]; hasIt { + storCdr.Cost, _ = strconv.ParseFloat(costStr, 64) + } + if ratedStr, hasIt := cgrCdr[utils.RATED]; hasIt { + storCdr.Rated, _ = strconv.ParseBool(ratedStr) + } return storCdr } diff --git a/engine/cgrcdr_test.go b/engine/cgrcdr_test.go index 961de2896..53397d155 100644 --- a/engine/cgrcdr_test.go +++ b/engine/cgrcdr_test.go @@ -50,3 +50,37 @@ func TestCgrCdrAsStoredCdr(t *testing.T) { t.Errorf("Expecting %v, received: %v", expctRtCdr, storedCdr) } } + +// Make sure the replicated CDR matches the expected StoredCdr +func TestReplicatedCgrCdrAsStoredCdr(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], + TOR: cgrCdr[utils.TOR], + AccId: cgrCdr[utils.ACCID], + CdrHost: cgrCdr[utils.CDRHOST], + CdrSource: 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), + 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], + DisconnectCause: cgrCdr[utils.DISCONNECT_CAUSE], + ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, + Cost: 0.12, + Rated: true, + } + if storedCdr := cgrCdr.AsStoredCdr(); !reflect.DeepEqual(expctRtCdr, storedCdr) { + t.Errorf("Expecting %v, received: %v", expctRtCdr, storedCdr) + } +} diff --git a/utils/consts.go b/utils/consts.go index 7300cfcc1..1f8c65349 100644 --- a/utils/consts.go +++ b/utils/consts.go @@ -218,5 +218,6 @@ const ( var ( CdreCdrFormats = []string{CSV, DRYRUN, CDRE_FIXED_WIDTH} - PrimaryCdrFields = []string{TOR, ACCID, CDRHOST, CDRSOURCE, REQTYPE, DIRECTION, TENANT, CATEGORY, ACCOUNT, SUBJECT, DESTINATION, SETUP_TIME, ANSWER_TIME, USAGE, SUPPLIER} + PrimaryCdrFields = []string{CGRID, TOR, ACCID, CDRHOST, CDRSOURCE, REQTYPE, DIRECTION, TENANT, CATEGORY, ACCOUNT, SUBJECT, DESTINATION, SETUP_TIME, PDD, ANSWER_TIME, USAGE, + SUPPLIER, DISCONNECT_CAUSE, COST, RATED} )