Updated CGRID generation when empty.Fix#1552

This commit is contained in:
Tripon Alexandru-Ionut
2019-05-31 17:28:57 +03:00
committed by Dan Christian Bogos
parent ee100d423d
commit 6a0377bbb8
10 changed files with 58 additions and 31 deletions

View File

@@ -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)
}

View File

@@ -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",

View File

@@ -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)

View File

@@ -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)
}

View File

@@ -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)

View File

@@ -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;

View File

@@ -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;

View File

@@ -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 {

View File

@@ -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 {

View File

@@ -18,10 +18,11 @@ along with this program. If not, see <http://www.gnu.org/licenses/>
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],