diff --git a/apier/v1/apier_it_test.go b/apier/v1/apier_it_test.go index 739ea7dd2..046ac5d57 100644 --- a/apier/v1/apier_it_test.go +++ b/apier/v1/apier_it_test.go @@ -1397,6 +1397,25 @@ func TestApierResetDataAfterLoadFromFolder(t *testing.T) { } } +func TestApierSetChargerS(t *testing.T) { + //add a default charger + chargerProfile := &ChargerWithCache{ + ChargerProfile: &engine.ChargerProfile{ + Tenant: "cgrates.org", + ID: "Default", + RunID: utils.MetaDefault, + AttributeIDs: []string{"*none"}, + Weight: 20, + }, + } + var result string + if err := rater.Call(utils.ApierV1SetChargerProfile, chargerProfile, &result); err != nil { + t.Error(err) + } else if result != utils.OK { + t.Error("Unexpected reply returned", result) + } +} + // Make sure balance was topped-up // Bug reported by DigiDaz over IRC func TestApierGetAccountAfterLoad(t *testing.T) { @@ -1435,7 +1454,6 @@ func TestApierResponderGetCost(t *testing.T) { } func TestApierMaxDebitInexistentAcnt(t *testing.T) { - cc := &engine.CallCost{} cd := &engine.CallDescriptorWithArgDispatcher{ CallDescriptor: &engine.CallDescriptor{ @@ -1454,7 +1472,6 @@ func TestApierMaxDebitInexistentAcnt(t *testing.T) { if err := rater.Call(utils.ResponderDebit, cd, cc); err == nil { t.Error(err.Error()) } - } func TestApierCdrServer(t *testing.T) { @@ -1478,7 +1495,7 @@ func TestApierCdrServer(t *testing.T) { func TestApierITGetCdrs(t *testing.T) { var reply []*engine.ExternalCDR - req := utils.AttrGetCdrs{MediationRunIds: []string{utils.MetaRaw}} + req := utils.AttrGetCdrs{MediationRunIds: []string{utils.MetaDefault}} if err := rater.Call(utils.ApierV1GetCDRs, req, &reply); err != nil { t.Error("Unexpected error: ", err.Error()) } else if len(reply) != 2 { @@ -1487,22 +1504,6 @@ func TestApierITGetCdrs(t *testing.T) { } func TestApierITProcessCdr(t *testing.T) { - //add a default charger - chargerProfile := &ChargerWithCache{ - ChargerProfile: &engine.ChargerProfile{ - Tenant: "cgrates.org", - ID: "Default", - RunID: utils.MetaDefault, - AttributeIDs: []string{"*none"}, - Weight: 20, - }, - } - var result string - if err := rater.Call(utils.ApierV1SetChargerProfile, chargerProfile, &result); err != nil { - t.Error(err) - } else if result != utils.OK { - t.Error("Unexpected reply returned", result) - } var reply string cdr := &engine.CDRWithArgDispatcher{ 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", @@ -1518,7 +1519,7 @@ func TestApierITProcessCdr(t *testing.T) { t.Error("Unexpected reply received: ", reply) } var cdrs []*engine.ExternalCDR - req := utils.AttrGetCdrs{MediationRunIds: []string{utils.MetaRaw}} + req := utils.AttrGetCdrs{MediationRunIds: []string{utils.MetaDefault}} if err := rater.Call(utils.ApierV1GetCDRs, req, &cdrs); err != nil { t.Error("Unexpected error: ", err.Error()) } else if len(cdrs) != 3 { diff --git a/apier/v1/cdre_it_test.go b/apier/v1/cdre_it_test.go index 9788c000f..36d76538e 100755 --- a/apier/v1/cdre_it_test.go +++ b/apier/v1/cdre_it_test.go @@ -208,7 +208,7 @@ func testCDReProcessExternalCdr(t *testing.T) { args := utils.RPCCDRsFilter{OriginIDs: []string{"testextcdr1"}} if err := cdreRPC.Call(utils.ApierV2GetCDRs, args, &cdrs); err != nil { t.Error("Unexpected error: ", err.Error()) - } else if len(cdrs) != 2 { + } else if len(cdrs) != 1 { t.Errorf("Unexpected number of CDRs returned: %v, cdrs=%s ", len(cdrs), utils.ToJSON(cdrs)) return } else { @@ -322,11 +322,11 @@ func testCDReExportCDRsWithAttributes(t *testing.T) { } else if len(rply.ExportedCGRIDs) != 2 { t.Errorf("Unexpected number of CDR exported: %s ", utils.ToJSON(rply)) } - fileContent1 := `Cdr3,*raw,test2,OriginCDR3,cgrates.org,ATTR_CATEGORY,1001,ATTR_SUBJECT,+4986517174963,30s,-1.0000 -Cdr2,*raw,test2,OriginCDR2,cgrates.org,ATTR_CATEGORY,1001,ATTR_SUBJECT,+4986517174963,5s,-1.0000 + fileContent1 := `Cdr3,*default,test2,OriginCDR3,cgrates.org,ATTR_CATEGORY,1001,ATTR_SUBJECT,+4986517174963,30s,-1.0000 +Cdr2,*default,test2,OriginCDR2,cgrates.org,ATTR_CATEGORY,1001,ATTR_SUBJECT,+4986517174963,5s,-1.0000 ` - fileContent2 := `Cdr2,*raw,test2,OriginCDR2,cgrates.org,ATTR_CATEGORY,1001,ATTR_SUBJECT,+4986517174963,5s,-1.0000 -Cdr3,*raw,test2,OriginCDR3,cgrates.org,ATTR_CATEGORY,1001,ATTR_SUBJECT,+4986517174963,30s,-1.0000 + fileContent2 := `Cdr2,*default,test2,OriginCDR2,cgrates.org,ATTR_CATEGORY,1001,ATTR_SUBJECT,+4986517174963,5s,-1.0000 +Cdr3,*default,test2,OriginCDR3,cgrates.org,ATTR_CATEGORY,1001,ATTR_SUBJECT,+4986517174963,30s,-1.0000 ` if outContent1, err := ioutil.ReadFile(rply.ExportedPath); err != nil { t.Error(err) diff --git a/apier/v2/cdrs_it_test.go b/apier/v2/cdrs_it_test.go index 05a4757e9..087037c21 100644 --- a/apier/v2/cdrs_it_test.go +++ b/apier/v2/cdrs_it_test.go @@ -687,6 +687,7 @@ func testV2CDRsGetCdrsWithRattingPlan(t *testing.T) { t.Errorf("Unexpected cost for CDR: %f", cdrs[0].Cost) } } + cdrs = []*engine.ExternalCDR{} // gob will not update zero value fields args = utils.RPCCDRsFilter{RunIDs: []string{"CustomerCharges"}, Accounts: []string{"testV2CDRsProcessCDR4"}} if err := cdrsRpc.Call(utils.ApierV2GetCDRs, args, &cdrs); err != nil { t.Error("Unexpected error: ", err.Error()) @@ -700,6 +701,7 @@ func testV2CDRsGetCdrsWithRattingPlan(t *testing.T) { t.Errorf("Expected ExtraInfo : %s received :%s", "", cdrs[0].ExtraInfo) } } + cdrs = []*engine.ExternalCDR{} // gob will not update zero value fields args = utils.RPCCDRsFilter{RunIDs: []string{"SupplierCharges"}, Accounts: []string{"testV2CDRsProcessCDR4"}} if err := cdrsRpc.Call(utils.ApierV2GetCDRs, args, &cdrs); err != nil { t.Error("Unexpected error: ", err.Error()) diff --git a/data/conf/samples/cdrewithattributes/cgrates.json b/data/conf/samples/cdrewithattributes/cgrates.json index 29700f57a..9960424d7 100755 --- a/data/conf/samples/cdrewithattributes/cgrates.json +++ b/data/conf/samples/cdrewithattributes/cgrates.json @@ -69,11 +69,6 @@ }, -"chargers": { - "enabled": true, - "attributes_conns": ["*internal"], -}, - "apier": { "caches_conns":["*internal"], "scheduler_conns": ["*internal"], diff --git a/data/conf/samples/cdrewithfilter/cgrates.json b/data/conf/samples/cdrewithfilter/cgrates.json index effebf23e..03f3dd42e 100755 --- a/data/conf/samples/cdrewithfilter/cgrates.json +++ b/data/conf/samples/cdrewithfilter/cgrates.json @@ -39,7 +39,6 @@ "cdrs": { "enabled": true, - "chargers_conns":["*internal"], "rals_conns": ["*internal"], }, diff --git a/engine/cdrs.go b/engine/cdrs.go index 7463a8c6c..48e204df2 100644 --- a/engine/cdrs.go +++ b/engine/cdrs.go @@ -686,54 +686,26 @@ func (cdrS *CDRServer) V1ProcessCDR(cdr *CDRWithArgDispatcher, reply *string) (e if cdr.Subject == utils.EmptyString { // Use account information as rating subject if missing cdr.Subject = cdr.Account } - if !cdr.PreRated { // Enforce the RunID if CDR is not rated - cdr.RunID = utils.MetaRaw - } - if utils.SliceHasMember([]string{"", utils.MetaRaw}, cdr.RunID) { - cdr.Cost = -1.0 + if cdr.RunID == utils.EmptyString { + cdr.RunID = utils.MetaDefault } cgrEv := &utils.CGREventWithArgDispatcher{ - CGREvent: &utils.CGREvent{ - Tenant: cdr.Tenant, - ID: utils.UUIDSha1Prefix(), - Event: cdr.AsMapStringIface(), - }, + CGREvent: cdr.AsCGREvent(), ArgDispatcher: cdr.ArgDispatcher, } - if len(cdrS.cgrCfg.CdrsCfg().AttributeSConns) != 0 { - if err = cdrS.attrSProcessEvent(cgrEv); err != nil { - err = utils.NewErrServerError(err) - return - } - } - if cdrS.cgrCfg.CdrsCfg().StoreCdrs { // Store *raw CDR - if err = cdrS.cdrDb.SetCDR(cdr.CDR, false); err != nil { - utils.Logger.Warning( - fmt.Sprintf("<%s> storing primary CDR %+v, got error: %s", - utils.CDRs, cdr, err.Error())) - err = utils.NewErrServerError(err) // Cannot store CDR - return - } - } - if len(cdrS.cgrCfg.CdrsCfg().OnlineCDRExports) != 0 { - cdrS.exportCDRs([]*CDR{cdr.CDR}) // Replicate raw CDR - } - if len(cdrS.cgrCfg.CdrsCfg().ThresholdSConns) != 0 { - go cdrS.thdSProcessEvent(cgrEv) - } - if len(cdrS.cgrCfg.CdrsCfg().StatSConns) != 0 { - go cdrS.statSProcessEvent(cgrEv) - } - if len(cdrS.cgrCfg.CdrsCfg().ChargerSConns) != 0 && - utils.SliceHasMember([]string{"", utils.MetaRaw}, cdr.RunID) { - go cdrS.chrgProcessEvent(cgrEv, len(cdrS.cgrCfg.CdrsCfg().AttributeSConns) != 0, - cdrS.cgrCfg.CdrsCfg().StoreCdrs, false, - len(cdrS.cgrCfg.CdrsCfg().OnlineCDRExports) != 0, len(cdrS.cgrCfg.CdrsCfg().ThresholdSConns) != 0, - len(cdrS.cgrCfg.CdrsCfg().StatSConns) != 0) + if err = cdrS.processEvent(cgrEv, + len(cdrS.cgrCfg.CdrsCfg().ChargerSConns) != 0 && !cdr.PreRated, + len(cdrS.cgrCfg.CdrsCfg().AttributeSConns) != 0, + !cdr.PreRated, // rate the CDR if is not PreRated + cdrS.cgrCfg.CdrsCfg().StoreCdrs, + false, // no rerate + len(cdrS.cgrCfg.CdrsCfg().OnlineCDRExports) != 0, + len(cdrS.cgrCfg.CdrsCfg().ThresholdSConns) != 0, + len(cdrS.cgrCfg.CdrsCfg().StatSConns) != 0); err != nil { + return } *reply = utils.OK - return } @@ -812,10 +784,8 @@ func (cdrS *CDRServer) V1ProcessEvent(arg *ArgV1ProcessEvent, reply *string) (er // end of processing options cgrEv := &utils.CGREventWithArgDispatcher{ - CGREvent: &arg.CGREvent, - } - if arg.ArgDispatcher != nil { - cgrEv.ArgDispatcher = arg.ArgDispatcher + CGREvent: &arg.CGREvent, + ArgDispatcher: arg.ArgDispatcher, } if err = cdrS.processEvent(cgrEv, chrgS, attrS, ralS, store, reRate, export, thdS, stS); err != nil { @@ -959,23 +929,27 @@ func (cdrS *CDRServer) V1RateCDRs(arg *ArgRateCDRs, reply *string) (err error) { if flgs.HasKey(utils.MetaStatS) { statS = flgs.GetBool(utils.MetaStatS) } - if flgs.GetBool(utils.MetaChargers) { - if len(cdrS.cgrCfg.CdrsCfg().ChargerSConns) == 0 { - return utils.NewErrNotConnected(utils.ChargerS) + chrgS := len(cdrS.cgrCfg.CdrsCfg().ChargerSConns) != 0 + if flgs.HasKey(utils.MetaChargers) { + chrgS = flgs.GetBool(utils.MetaChargers) + } + + if chrgS && len(cdrS.cgrCfg.CdrsCfg().ChargerSConns) == 0 { + return utils.NewErrNotConnected(utils.ChargerS) + } + for _, cdr := range cdrs { + cdr.Cost = -1 // the cost will be recalculated + cgrEv := &utils.CGREventWithArgDispatcher{ + CGREvent: cdr.AsCGREvent(), + ArgDispatcher: arg.ArgDispatcher, } - for _, cdr := range cdrs { - argCharger := &utils.CGREventWithArgDispatcher{ - CGREvent: cdr.AsCGREvent(), - ArgDispatcher: arg.ArgDispatcher, - } - if err = cdrS.chrgProcessEvent(argCharger, - false, store, true, export, thdS, statS); err != nil { - return utils.NewErrServerError(err) - } + if err = cdrS.processEvent(cgrEv, + chrgS, false, true, store, true, export, thdS, statS); err != nil { + return utils.NewErrServerError(err) } } *reply = utils.OK - return nil + return } // V1ProcessExternalCDR is used to process external CDRs diff --git a/general_tests/cdrs_processevent_it_test.go b/general_tests/cdrs_processevent_it_test.go index 7143cb2f5..cdf7b317f 100644 --- a/general_tests/cdrs_processevent_it_test.go +++ b/general_tests/cdrs_processevent_it_test.go @@ -184,7 +184,7 @@ func testV1CDRsProcessEventAttrS(t *testing.T) { var replyAt *engine.AttributeProfile if err := pecdrsRpc.Call(utils.ApierV1GetAttributeProfile, &utils.TenantID{Tenant: "cgrates.org", ID: "ApierTest"}, &replyAt); err != nil { - t.Error(err) + t.Fatal(err) } replyAt.Compile() if !reflect.DeepEqual(alsPrf, replyAt) { diff --git a/utils/consts.go b/utils/consts.go index e979c9916..a3a0ac64a 100755 --- a/utils/consts.go +++ b/utils/consts.go @@ -302,8 +302,6 @@ const ( MetaSQSjsonMap = "*sqs_json_map" MetaKafkajsonMap = "*kafka_json_map" MetaSQL = "*sql" - MetaMySQL = "*mysql" - MetaPostgres = "*postgres" MetaS3jsonMap = "*s3_json_map" CONFIG_PATH = "/etc/cgrates/" DISCONNECT_CAUSE = "DisconnectCause"