From 6a0377bbb8eb5012f57f7da8d28b85d9a1db90d6 Mon Sep 17 00:00:00 2001 From: Tripon Alexandru-Ionut Date: Fri, 31 May 2019 17:28:57 +0300 Subject: [PATCH] Updated CGRID generation when empty.Fix#1552 --- cdrc/csv.go | 2 +- cdrc/csv_test.go | 10 ++-- cdrc/fwv.go | 2 +- cdrc/xml.go | 2 +- cdrc/xml_test.go | 57 ++++++++++++++------ data/storage/mysql/create_cdrs_tables.sql | 2 +- data/storage/postgres/create_cdrs_tables.sql | 2 +- engine/action.go | 2 +- engine/cgrcdr.go | 3 +- engine/cgrcdr_test.go | 7 +-- 10 files changed, 58 insertions(+), 31 deletions(-) diff --git a/cdrc/csv.go b/cdrc/csv.go index 207c6de28..60a40dfbd 100644 --- a/cdrc/csv.go +++ b/cdrc/csv.go @@ -188,7 +188,7 @@ func (self *CsvRecordsProcessor) recordToStoredCdr(record []string, cdrcCfg *con return nil, err } } - storedCdr.CGRID = utils.Sha1(storedCdr.OriginID, storedCdr.SetupTime.UTC().String()) + storedCdr.CGRID = utils.Sha1(storedCdr.OriginID, storedCdr.OriginHost) if storedCdr.ToR == utils.DATA && cdrcCfg.DataUsageMultiplyFactor != 0 { storedCdr.Usage = time.Duration(float64(storedCdr.Usage.Nanoseconds()) * cdrcCfg.DataUsageMultiplyFactor) } diff --git a/cdrc/csv_test.go b/cdrc/csv_test.go index 71615e190..afef8603f 100644 --- a/cdrc/csv_test.go +++ b/cdrc/csv_test.go @@ -48,7 +48,7 @@ func TestCsvRecordToCDR(t *testing.T) { t.Error("Failed to parse CDR in rated cdr", err) } expectedCdr := &engine.CDR{ - CGRID: utils.Sha1(cdrRow[3], time.Date(2013, 2, 3, 19, 50, 0, 0, time.UTC).String()), + CGRID: utils.Sha1(cdrRow[3], "0.0.0.0"), RunID: utils.MetaDefault, ToR: cdrRow[2], OriginID: cdrRow[3], @@ -88,9 +88,9 @@ func TestCsvDataMultiplyFactor(t *testing.T) { if err != nil { t.Error("Failed to parse CDR in rated cdr", err) } - var sTime time.Time + // var sTime time.Time expectedCdr := &engine.CDR{ - CGRID: utils.Sha1("", sTime.String()), + CGRID: utils.Sha1("", "0.0.0.0"), ToR: cdrRow[0], OriginHost: "0.0.0.0", Source: "TEST_CDRC", @@ -103,7 +103,7 @@ func TestCsvDataMultiplyFactor(t *testing.T) { } csvProcessor.cdrcCfgs[0].DataUsageMultiplyFactor = 1024 expectedCdr = &engine.CDR{ - CGRID: utils.Sha1("", sTime.String()), + CGRID: utils.Sha1("", "0.0.0.0"), ToR: cdrRow[0], OriginHost: "0.0.0.0", Source: "TEST_CDRC", @@ -117,7 +117,7 @@ func TestCsvDataMultiplyFactor(t *testing.T) { } cdrRow = []string{"*voice", "1s"} expectedCdr = &engine.CDR{ - CGRID: utils.Sha1("", sTime.String()), + CGRID: utils.Sha1("", "0.0.0.0"), ToR: cdrRow[0], OriginHost: "0.0.0.0", Source: "TEST_CDRC", diff --git a/cdrc/fwv.go b/cdrc/fwv.go index db63ce8b5..863d74047 100644 --- a/cdrc/fwv.go +++ b/cdrc/fwv.go @@ -198,7 +198,7 @@ func (self *FwvRecordsProcessor) recordToStoredCdr(record string, cdrcCfg *confi } } if storedCdr.CGRID == "" && storedCdr.OriginID != "" && cfgKey != "*header" { - storedCdr.CGRID = utils.Sha1(storedCdr.OriginID, storedCdr.SetupTime.UTC().String()) + storedCdr.CGRID = utils.Sha1(storedCdr.OriginID, storedCdr.OriginHost) } if storedCdr.ToR == utils.DATA && duMultiplyFactor != 0 { storedCdr.Usage = time.Duration(float64(storedCdr.Usage.Nanoseconds()) * duMultiplyFactor) diff --git a/cdrc/xml.go b/cdrc/xml.go index d5c2b1319..d2840b8b0 100644 --- a/cdrc/xml.go +++ b/cdrc/xml.go @@ -176,7 +176,7 @@ func (xmlProc *XMLRecordsProcessor) recordToCDR(xmlEntity *xmlquery.Node, cdrcCf return nil, err } } - cdr.CGRID = utils.Sha1(cdr.OriginID, cdr.SetupTime.UTC().String()) + cdr.CGRID = utils.Sha1(cdr.OriginID, cdr.OriginHost) if cdr.ToR == utils.DATA && cdrcCfg.DataUsageMultiplyFactor != 0 { cdr.Usage = time.Duration(float64(cdr.Usage.Nanoseconds()) * cdrcCfg.DataUsageMultiplyFactor) } diff --git a/cdrc/xml_test.go b/cdrc/xml_test.go index 3a34e1ac2..508ad4c5e 100644 --- a/cdrc/xml_test.go +++ b/cdrc/xml_test.go @@ -257,14 +257,23 @@ func TestXMLRPProcess(t *testing.T) { t.Error(err) } expectedCDRs := []*engine.CDR{ - {CGRID: "1f045359a0784d15e051d7e41ae30132b139d714", - OriginHost: "0.0.0.0", Source: "TestXML", OriginID: "25160047719:0", - ToR: "*voice", RequestType: "*rated", Tenant: "cgrates.org", - Category: "call", Account: "1001", Destination: "+4986517174963", + { + CGRID: utils.Sha1("25160047719:0", "0.0.0.0"), + OriginHost: "0.0.0.0", + Source: "TestXML", + OriginID: "25160047719:0", + ToR: "*voice", + RequestType: "*rated", + Tenant: "cgrates.org", + Category: "call", + Account: "1001", + Destination: "+4986517174963", SetupTime: time.Date(2016, 4, 19, 21, 0, 5, 247000000, time.UTC), AnswerTime: time.Date(2016, 4, 19, 21, 0, 6, 813000000, time.UTC), Usage: time.Duration(13483000000), - ExtraFields: map[string]string{}, Cost: -1}, + ExtraFields: map[string]string{}, + Cost: -1, + }, } if !reflect.DeepEqual(expectedCDRs, cdrs) { t.Errorf("Expecting: %+v\n, received: %+v\n", expectedCDRs, cdrs) @@ -329,14 +338,23 @@ func TestXMLRPProcessWithNewFilters(t *testing.T) { t.Error(err) } expectedCDRs := []*engine.CDR{ - {CGRID: "1f045359a0784d15e051d7e41ae30132b139d714", - OriginHost: "0.0.0.0", Source: "XMLWithFilters", OriginID: "25160047719:0", - ToR: "*voice", RequestType: "*rated", Tenant: "cgrates.org", - Category: "call", Account: "1001", Destination: "+4986517174963", + { + CGRID: utils.Sha1("25160047719:0", "0.0.0.0"), + OriginHost: "0.0.0.0", + Source: "XMLWithFilters", + OriginID: "25160047719:0", + ToR: "*voice", + RequestType: "*rated", + Tenant: "cgrates.org", + Category: "call", + Account: "1001", + Destination: "+4986517174963", SetupTime: time.Date(2016, 4, 19, 21, 0, 5, 247000000, time.UTC), AnswerTime: time.Date(2016, 4, 19, 21, 0, 6, 813000000, time.UTC), Usage: time.Duration(13483000000), - ExtraFields: map[string]string{}, Cost: -1}, + ExtraFields: map[string]string{}, + Cost: -1, + }, } if !reflect.DeepEqual(expectedCDRs, cdrs) { t.Errorf("Expecting: %+v\n, received: %+v\n", expectedCDRs, cdrs) @@ -588,14 +606,23 @@ func TestXMLRPNestingSeparator(t *testing.T) { t.Error(err) } expectedCDRs := []*engine.CDR{ - {CGRID: "0ad7f9554ff8fc5b3a7cebbe7431bbf809bc5144", - OriginHost: "0.0.0.0", Source: "zw_cfs1", OriginID: "46d7974398c2671016afccc3f2c428c7", - ToR: "*voice", RequestType: "*rated", Tenant: "XX.liquid.tel", - Category: "call", Account: "+27110493421", Destination: "+270843073451", + { + CGRID: utils.Sha1("46d7974398c2671016afccc3f2c428c7", "0.0.0.0"), + OriginHost: "0.0.0.0", + Source: "zw_cfs1", + OriginID: "46d7974398c2671016afccc3f2c428c7", + ToR: "*voice", + RequestType: "*rated", + Tenant: "XX.liquid.tel", + Category: "call", + Account: "+27110493421", + Destination: "+270843073451", SetupTime: time.Date(2017, 11, 9, 11, 5, 34, 973000000, time.UTC), AnswerTime: time.Date(2017, 11, 9, 11, 5, 39, 364000000, time.UTC), Usage: time.Duration(53737000000), - ExtraFields: map[string]string{}, Cost: -1}, + ExtraFields: map[string]string{}, + Cost: -1, + }, } if !reflect.DeepEqual(expectedCDRs, cdrs) { t.Errorf("Expecting: %+v\n, received: %+v\n", expectedCDRs, cdrs) diff --git a/data/storage/mysql/create_cdrs_tables.sql b/data/storage/mysql/create_cdrs_tables.sql index 3ceb65729..6c2a917e6 100644 --- a/data/storage/mysql/create_cdrs_tables.sql +++ b/data/storage/mysql/create_cdrs_tables.sql @@ -29,7 +29,7 @@ CREATE TABLE cdrs ( updated_at TIMESTAMP NULL, deleted_at TIMESTAMP NULL, PRIMARY KEY (id), - UNIQUE KEY cdrrun (cgrid, run_id, origin_id) + UNIQUE KEY cdrrun (cgrid, run_id) ); DROP TABLE IF EXISTS session_costs; diff --git a/data/storage/postgres/create_cdrs_tables.sql b/data/storage/postgres/create_cdrs_tables.sql index 70e8b1b26..f7d203382 100644 --- a/data/storage/postgres/create_cdrs_tables.sql +++ b/data/storage/postgres/create_cdrs_tables.sql @@ -28,7 +28,7 @@ CREATE TABLE cdrs ( created_at TIMESTAMP WITH TIME ZONE, updated_at TIMESTAMP WITH TIME ZONE NULL, deleted_at TIMESTAMP WITH TIME ZONE NULL, - UNIQUE (cgrid, run_id, origin_id) + UNIQUE (cgrid, run_id) ); ; DROP INDEX IF EXISTS deleted_at_cp_idx; diff --git a/engine/action.go b/engine/action.go index e38185288..42bdee88a 100644 --- a/engine/action.go +++ b/engine/action.go @@ -202,7 +202,7 @@ func cdrLogAction(acc *Account, a *Action, acs Actions, extraData interface{}) ( ExtraFields: make(map[string]string), PreRated: true, } - cdr.CGRID = utils.Sha1(cdr.OriginID, cdr.SetupTime.String()) + cdr.CGRID = utils.Sha1(cdr.OriginID, cdr.OriginHost) cdr.Usage = time.Duration(1) elem := reflect.ValueOf(cdr).Elem() for key, rsrFlds := range defaultTemplate { diff --git a/engine/cgrcdr.go b/engine/cgrcdr.go index 5f4c37b02..6b6ec90e7 100644 --- a/engine/cgrcdr.go +++ b/engine/cgrcdr.go @@ -45,8 +45,7 @@ func (cgrCdr CgrCdr) getCGRID(timezone string) string { if CGRID, hasIt := cgrCdr[utils.CGRID]; hasIt { return CGRID } - setupTime, _ := utils.ParseTimeDetectLayout(cgrCdr[utils.SetupTime], timezone) - return utils.Sha1(cgrCdr[utils.OriginID], setupTime.UTC().String()) + return utils.Sha1(cgrCdr[utils.OriginID], cgrCdr[utils.OriginHost]) } func (cgrCdr CgrCdr) getExtraFields() map[string]string { diff --git a/engine/cgrcdr_test.go b/engine/cgrcdr_test.go index 5f4f6de70..4ece8231d 100644 --- a/engine/cgrcdr_test.go +++ b/engine/cgrcdr_test.go @@ -18,10 +18,11 @@ along with this program. If not, see package engine import ( - "github.com/cgrates/cgrates/utils" "reflect" "testing" "time" + + "github.com/cgrates/cgrates/utils" ) /* @@ -40,8 +41,8 @@ func TestCgrCdrAsCDR(t *testing.T) { utils.Account: "1001", utils.Subject: "1001", utils.Destination: "1002", utils.SetupTime: "2013-11-07T08:42:20Z", utils.AnswerTime: "2013-11-07T08:42:26Z", utils.Usage: "10s", "field_extr1": "val_extr1", "fieldextr2": "valextr2"} - setupTime, _ := utils.ParseTimeDetectLayout(cgrCdr[utils.SetupTime], "") - expctRtCdr := &CDR{CGRID: utils.Sha1(cgrCdr[utils.OriginID], setupTime.String()), + // setupTime, _ := utils.ParseTimeDetectLayout(cgrCdr[utils.SetupTime], "") + expctRtCdr := &CDR{CGRID: utils.Sha1(cgrCdr[utils.OriginID], cgrCdr[utils.OriginHost]), ToR: utils.VOICE, OriginID: cgrCdr[utils.OriginID], OriginHost: cgrCdr[utils.OriginHost], Source: cgrCdr[utils.Source],