diff --git a/cache2go/response_cache.go b/cache2go/response_cache.go index eba9dcf2e..c7631cc57 100644 --- a/cache2go/response_cache.go +++ b/cache2go/response_cache.go @@ -32,6 +32,7 @@ func NewResponseCache(ttl time.Duration) *ResponseCache { } func (rc *ResponseCache) Cache(key string, item *CacheItem) { + //utils.Logger.Info("key: " + key) if rc.ttl == 0 { return } @@ -58,6 +59,7 @@ func (rc *ResponseCache) Get(key string) (*CacheItem, error) { item, ok := rc.cache[key] rc.mu.RUnlock() if ok { + //utils.Logger.Info(",,,,,,,,,,,,,,,,,,,,,Found key: " + key) return item, nil } rc.wait(key) // wait for other goroutine processsing this key @@ -67,6 +69,7 @@ func (rc *ResponseCache) Get(key string) (*CacheItem, error) { if !ok { return nil, ErrNotFound } + //utils.Logger.Info("............................Found key: " + key) return item, nil } diff --git a/data/conf/samples/smg/cgrates.json b/data/conf/samples/smg/cgrates.json index 9f343a378..d49f06d2b 100644 --- a/data/conf/samples/smg/cgrates.json +++ b/data/conf/samples/smg/cgrates.json @@ -4,6 +4,10 @@ // Used for cgradmin // Starts rater, scheduler +"general": { + "response_cache_ttl": "1s", +}, + "listen": { "rpc_json": ":2012", // RPC JSON listening address "rpc_gob": ":2013", // RPC GOB listening address diff --git a/data/tariffplans/testtp/AccountActions.csv b/data/tariffplans/testtp/AccountActions.csv index 9fa3f8977..3adcdcb1f 100644 --- a/data/tariffplans/testtp/AccountActions.csv +++ b/data/tariffplans/testtp/AccountActions.csv @@ -10,4 +10,4 @@ cgrates.org,1011,TEST_VOICE,,, cgrates.org,1012,PREPAID_10,,, cgrates.org,1013,TEST_NEG,,, cgrates.org,1014,TEST_RPC,,, -cgrates.org,1015,,,, +cgrates.org,1015,TEST_DID,,, diff --git a/data/tariffplans/testtp/ActionPlans.csv b/data/tariffplans/testtp/ActionPlans.csv index 897278d0e..636888218 100644 --- a/data/tariffplans/testtp/ActionPlans.csv +++ b/data/tariffplans/testtp/ActionPlans.csv @@ -5,4 +5,5 @@ TEST_EXE,TOPUP_EXE,ALWAYS,10 TEST_DATA_r,TOPUP_DATA_r,ASAP,10 TEST_VOICE,TOPUP_VOICE,ASAP,10 TEST_NEG,TOPUP_NEG,ASAP,10 -TEST_RPC,RPC,ALWAYS,10 \ No newline at end of file +TEST_RPC,RPC,ALWAYS,10 +TEST_DID,DID,ALWAYS,10 diff --git a/engine/actions_test.go b/engine/actions_test.go index ebfd7b86f..26c358c8d 100644 --- a/engine/actions_test.go +++ b/engine/actions_test.go @@ -2233,7 +2233,9 @@ func TestValueFormulaDebit(t *testing.T) { } at.Execute() afterUb, err := accountingStorage.GetAccount("cgrates.org:vf") - if err != nil || afterUb.BalanceMap[utils.MONETARY].GetTotalValue() != -0.333334 { + // not an exact value, depends of month + v := afterUb.BalanceMap[utils.MONETARY].GetTotalValue() + if err != nil || v > -0.30 || v < -0.35 { t.Error("error debiting account: ", err, utils.ToIJSON(afterUb)) } } diff --git a/engine/calldesc.go b/engine/calldesc.go index e126df79e..d62a0005e 100644 --- a/engine/calldesc.go +++ b/engine/calldesc.go @@ -933,6 +933,8 @@ func (cd *CallDescriptor) Clone() *CallDescriptor { ForceDuration: cd.ForceDuration, PerformRounding: cd.PerformRounding, DryRun: cd.DryRun, + CgrID: cd.CgrID, + RunID: cd.RunID, } } diff --git a/engine/responder.go b/engine/responder.go index 8c6009db6..751d3299c 100644 --- a/engine/responder.go +++ b/engine/responder.go @@ -147,7 +147,8 @@ func (rs *Responder) Debit(arg *CallDescriptor, reply *CallCost) (err error) { } func (rs *Responder) MaxDebit(arg *CallDescriptor, reply *CallCost) (err error) { - if item, err := rs.getCache().Get(utils.MAX_DEBIT_CACHE_PREFIX + arg.CgrID + arg.RunID); err == nil && item != nil { + cacheKey := utils.MAX_DEBIT_CACHE_PREFIX + arg.CgrID + arg.RunID + arg.DurationIndex.String() + if item, err := rs.getCache().Get(cacheKey); err == nil && item != nil { *reply = *(item.Value.(*CallCost)) return item.Err } @@ -178,7 +179,7 @@ func (rs *Responder) MaxDebit(arg *CallDescriptor, reply *CallCost) (err error) } else { r, e := arg.MaxDebit() if e != nil { - rs.getCache().Cache(utils.MAX_DEBIT_CACHE_PREFIX+arg.CgrID+arg.RunID, &cache2go.CacheItem{ + rs.getCache().Cache(cacheKey, &cache2go.CacheItem{ Err: e, }) return e @@ -186,7 +187,7 @@ func (rs *Responder) MaxDebit(arg *CallDescriptor, reply *CallCost) (err error) *reply = *r } } - rs.getCache().Cache(utils.MAX_DEBIT_CACHE_PREFIX+arg.CgrID+arg.RunID, &cache2go.CacheItem{ + rs.getCache().Cache(cacheKey, &cache2go.CacheItem{ Value: reply, Err: err, }) @@ -194,7 +195,8 @@ func (rs *Responder) MaxDebit(arg *CallDescriptor, reply *CallCost) (err error) } func (rs *Responder) RefundIncrements(arg *CallDescriptor, reply *float64) (err error) { - if item, err := rs.getCache().Get(utils.REFUND_INCR_CACHE_PREFIX + arg.CgrID + arg.RunID); err == nil && item != nil { + cacheKey := utils.REFUND_INCR_CACHE_PREFIX + arg.CgrID + arg.RunID + if item, err := rs.getCache().Get(cacheKey); err == nil && item != nil { *reply = *(item.Value.(*float64)) return item.Err } @@ -216,6 +218,9 @@ func (rs *Responder) RefundIncrements(arg *CallDescriptor, reply *float64) (err Subject: arg.Subject, Context: utils.ALIAS_CONTEXT_RATING, }, arg, utils.EXTRA_FIELDS); err != nil && err != utils.ErrNotFound { + rs.getCache().Cache(cacheKey, &cache2go.CacheItem{ + Err: err, + }) return err } @@ -224,7 +229,7 @@ func (rs *Responder) RefundIncrements(arg *CallDescriptor, reply *float64) (err } else { err = arg.RefundIncrements() } - rs.getCache().Cache(utils.REFUND_INCR_CACHE_PREFIX+arg.CgrID+arg.RunID, &cache2go.CacheItem{ + rs.getCache().Cache(cacheKey, &cache2go.CacheItem{ Value: reply, Err: err, }) @@ -232,7 +237,8 @@ func (rs *Responder) RefundIncrements(arg *CallDescriptor, reply *float64) (err } func (rs *Responder) RefundRounding(arg *CallDescriptor, reply *float64) (err error) { - if item, err := rs.getCache().Get(utils.REFUND_ROUND_CACHE_PREFIX + arg.CgrID + arg.RunID); err == nil && item != nil { + cacheKey := utils.REFUND_ROUND_CACHE_PREFIX + arg.CgrID + arg.RunID + arg.DurationIndex.String() + if item, err := rs.getCache().Get(cacheKey); err == nil && item != nil { *reply = *(item.Value.(*float64)) return item.Err } @@ -254,6 +260,9 @@ func (rs *Responder) RefundRounding(arg *CallDescriptor, reply *float64) (err er Subject: arg.Subject, Context: utils.ALIAS_CONTEXT_RATING, }, arg, utils.EXTRA_FIELDS); err != nil && err != utils.ErrNotFound { + rs.getCache().Cache(cacheKey, &cache2go.CacheItem{ + Err: err, + }) return err } @@ -262,7 +271,7 @@ func (rs *Responder) RefundRounding(arg *CallDescriptor, reply *float64) (err er } else { err = arg.RefundRounding() } - rs.getCache().Cache(utils.REFUND_ROUND_CACHE_PREFIX+arg.CgrID+arg.RunID, &cache2go.CacheItem{ + rs.getCache().Cache(cacheKey, &cache2go.CacheItem{ Value: reply, Err: err, }) @@ -305,11 +314,17 @@ func (rs *Responder) GetDerivedMaxSessionTime(ev *CDR, reply *float64) error { if rs.Bal != nil { return errors.New("unsupported method on the balancer") } + cacheKey := utils.GET_DERIV_MAX_SESS_TIME + ev.CGRID + ev.RunID + if item, err := rs.getCache().Get(cacheKey); err == nil && item != nil { + *reply = *(item.Value.(*float64)) + return item.Err + } if ev.Subject == "" { ev.Subject = ev.Account } // replace user profile fields if err := LoadUserProfile(ev, utils.EXTRA_FIELDS); err != nil { + rs.getCache().Cache(cacheKey, &cache2go.CacheItem{Err: err}) return err } // replace aliases @@ -323,6 +338,7 @@ func (rs *Responder) GetDerivedMaxSessionTime(ev *CDR, reply *float64) error { Subject: ev.Subject, Context: utils.ALIAS_CONTEXT_RATING, }, ev, utils.EXTRA_FIELDS); err != nil && err != utils.ErrNotFound { + rs.getCache().Cache(cacheKey, &cache2go.CacheItem{Err: err}) return err } @@ -331,6 +347,7 @@ func (rs *Responder) GetDerivedMaxSessionTime(ev *CDR, reply *float64) 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(cacheKey, &cache2go.CacheItem{Err: err}) return err } dcs, _ = dcs.AppendDefaultRun() @@ -351,10 +368,12 @@ func (rs *Responder) GetDerivedMaxSessionTime(ev *CDR, reply *float64) error { } startTime, err := ev.GetSetupTime(utils.META_DEFAULT, rs.Timezone) if err != nil { + rs.getCache().Cache(cacheKey, &cache2go.CacheItem{Err: err}) return err } usage, err := ev.GetDuration(utils.META_DEFAULT) if err != nil { + rs.getCache().Cache(cacheKey, &cache2go.CacheItem{Err: err}) return err } if usage == 0 { @@ -362,7 +381,7 @@ func (rs *Responder) GetDerivedMaxSessionTime(ev *CDR, reply *float64) error { } cd := &CallDescriptor{ CgrID: ev.GetCgrId(rs.Timezone), - RunID: ev.RunID, + RunID: dc.RunID, TOR: ev.ToR, Direction: ev.GetDirection(dc.DirectionField), Tenant: ev.GetTenant(dc.TenantField), @@ -377,6 +396,7 @@ func (rs *Responder) GetDerivedMaxSessionTime(ev *CDR, reply *float64) error { err = rs.GetMaxSessionTime(cd, &remainingDuration) if err != nil { *reply = 0 + rs.getCache().Cache(cacheKey, &cache2go.CacheItem{Err: err}) return err } if utils.IsSliceMember([]string{utils.META_POSTPAID, utils.POSTPAID}, ev.GetReqType(dc.RequestTypeField)) { @@ -390,6 +410,7 @@ func (rs *Responder) GetDerivedMaxSessionTime(ev *CDR, reply *float64) error { maxCallDuration = remainingDuration } } + rs.getCache().Cache(cacheKey, &cache2go.CacheItem{Value: maxCallDuration}) *reply = maxCallDuration return nil } @@ -399,6 +420,11 @@ func (rs *Responder) GetSessionRuns(ev *CDR, sRuns *[]*SessionRun) error { if rs.Bal != nil { return errors.New("Unsupported method on the balancer") } + cacheKey := utils.GET_SESS_RUNS_CACHE_PREFIX + ev.CGRID + if item, err := rs.getCache().Get(cacheKey); err == nil && item != nil { + *sRuns = *(item.Value.(*[]*SessionRun)) + return item.Err + } if ev.Subject == "" { ev.Subject = ev.Account } @@ -427,7 +453,7 @@ func (rs *Responder) GetSessionRuns(ev *CDR, sRuns *[]*SessionRun) error { //utils.Logger.Info(fmt.Sprintf("Derived chargers for: %+v", attrsDC)) 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(cacheKey, &cache2go.CacheItem{ Err: err, }) return err @@ -441,22 +467,18 @@ func (rs *Responder) GetSessionRuns(ev *CDR, 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{ - Err: err, - }) + rs.getCache().Cache(cacheKey, &cache2go.CacheItem{Err: err}) return errors.New("Error parsing answer event start time") } endTime, err := ev.GetEndTime("", rs.Timezone) if err != nil { - rs.getCache().Cache(utils.GET_SESS_RUNS_CACHE_PREFIX+ev.CGRID, &cache2go.CacheItem{ - Err: err, - }) + rs.getCache().Cache(cacheKey, &cache2go.CacheItem{Err: err}) return errors.New("Error parsing answer event end time") } extraFields := ev.GetExtraFields() cd := &CallDescriptor{ CgrID: ev.GetCgrId(rs.Timezone), - RunID: ev.RunID, + RunID: dc.RunID, TOR: ev.ToR, Direction: ev.GetDirection(dc.DirectionField), Tenant: ev.GetTenant(dc.TenantField), @@ -477,9 +499,7 @@ func (rs *Responder) GetSessionRuns(ev *CDR, sRuns *[]*SessionRun) error { } //utils.Logger.Info(fmt.Sprintf("RUNS: %v", len(sesRuns))) *sRuns = sesRuns - rs.getCache().Cache(utils.GET_SESS_RUNS_CACHE_PREFIX+ev.CGRID, &cache2go.CacheItem{ - Value: sRuns, - }) + rs.getCache().Cache(cacheKey, &cache2go.CacheItem{Value: sRuns}) return nil } @@ -497,6 +517,10 @@ func (rs *Responder) GetDerivedChargers(attrs *utils.AttrDerivedChargers, dcs *u func (rs *Responder) GetLCR(attrs *AttrGetLcr, reply *LCRCost) error { cacheKey := utils.LCRCachePrefix + attrs.CgrID + attrs.RunID + if item, err := rs.getCache().Get(cacheKey); err == nil && item != nil { + *reply = *(item.Value.(*LCRCost)) + return item.Err + } if attrs.CallDescriptor.Subject == "" { attrs.CallDescriptor.Subject = attrs.CallDescriptor.Account } diff --git a/engine/responder_test.go b/engine/responder_test.go index ed3f002f2..9651382ec 100644 --- a/engine/responder_test.go +++ b/engine/responder_test.go @@ -153,10 +153,10 @@ func TestResponderGetSessionRuns(t *testing.T) { sesRuns := make([]*SessionRun, 0) eSRuns := []*SessionRun{ &SessionRun{DerivedCharger: extra1DC, - CallDescriptor: &CallDescriptor{CgrID: utils.Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), RunID: "*default", Direction: "*out", Category: "0", + CallDescriptor: &CallDescriptor{CgrID: utils.Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), RunID: "extra1", Direction: "*out", Category: "0", Tenant: "vdf", Subject: "rif", Account: "minitsboy", Destination: "0256", TimeStart: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), TimeEnd: time.Date(2013, 11, 7, 8, 42, 36, 0, time.UTC), TOR: utils.VOICE, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}}}, &SessionRun{DerivedCharger: extra2DC, - CallDescriptor: &CallDescriptor{CgrID: utils.Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), RunID: "*default", Direction: "*out", Category: "call", + CallDescriptor: &CallDescriptor{CgrID: utils.Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), RunID: "extra2", Direction: "*out", Category: "call", Tenant: "vdf", Subject: "ivo", Account: "ivo", Destination: "1002", TimeStart: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), TimeEnd: time.Date(2013, 11, 7, 8, 42, 36, 0, time.UTC), TOR: utils.VOICE, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}}}, &SessionRun{DerivedCharger: dfDC, CallDescriptor: &CallDescriptor{CgrID: utils.Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), RunID: "*default", Direction: "*out", Category: "call", @@ -165,7 +165,7 @@ func TestResponderGetSessionRuns(t *testing.T) { t.Error(err) } else if !reflect.DeepEqual(eSRuns, sesRuns) { for _, sr := range sesRuns { - t.Logf("sr cd: %+v", sr.CallDescriptor) + t.Logf("sr cd: %s", utils.ToIJSON(sr.CallDescriptor)) } t.Errorf("Expecting: %+v, received: %+v", eSRuns, sesRuns) } diff --git a/general_tests/tp_it_test.go b/general_tests/tp_it_test.go index a917c9961..8fb9ca7b2 100644 --- a/general_tests/tp_it_test.go +++ b/general_tests/tp_it_test.go @@ -341,6 +341,9 @@ func TestTpRemActionsRefenced(t *testing.T) { if !*testIntegration { return } + + // no more reference check for sake of speed! + actionsMap := make(map[string]engine.Actions) if err := tpRPC.Call("ApierV2.GetActions", v2.AttrGetActions{ ActionIDs: []string{"TOPUP_VOICE"}, @@ -352,16 +355,14 @@ func TestTpRemActionsRefenced(t *testing.T) { var reply string if err := tpRPC.Call("ApierV2.RemActions", v1.AttrRemActions{ ActionIDs: []string{"TOPUP_VOICE"}, - }, &reply); err == nil { - t.Error("No error on ApierV2.RemActions: ", err.Error()) - } else if reply == utils.OK { + }, &reply); err != nil { + t.Error("Error on ApierV2.RemActions: ", err.Error()) + } else if reply != utils.OK { t.Errorf("Calling ApierV2.RemActions got reply: %s", reply) } if err := tpRPC.Call("ApierV2.GetActions", v2.AttrGetActions{ - ActionIDs: []string{"TOPUP_VOICE"}, - }, &actionsMap); err != nil { - t.Error("Got error on ApierV2.GetActions: ", err.Error()) - } else if len(actionsMap) != 1 { - t.Errorf("Calling ApierV2.GetActions got reply: %s", utils.ToIJSON(actionsMap)) + ActionIDs: []string{"PAYMENT_2056bd2fe137082970f97102b64e42fd"}, + }, &actionsMap); err == nil { + t.Error("no error on ApierV2.GetActions: ", err) } } diff --git a/sessionmanager/data_it_test.go b/sessionmanager/data_it_test.go index 726e6d5d4..ee73c7f38 100644 --- a/sessionmanager/data_it_test.go +++ b/sessionmanager/data_it_test.go @@ -96,7 +96,7 @@ func TestSMGDataLastUsedData(t *testing.T) { smgEv := SMGenericEvent{ utils.EVENT_NAME: "TEST_EVENT", utils.TOR: utils.DATA, - utils.ACCID: "12349", + utils.ACCID: "123491", utils.DIRECTION: utils.OUT, utils.ACCOUNT: "1010", utils.SUBJECT: "1010", @@ -104,7 +104,7 @@ func TestSMGDataLastUsedData(t *testing.T) { utils.CATEGORY: "data", utils.TENANT: "cgrates.org", utils.REQTYPE: utils.META_PREPAID, - utils.SETUP_TIME: "2016-01-05 18:30:49", + utils.SETUP_TIME: "2016-01-05 18:30:59", utils.ANSWER_TIME: "2016-01-05 18:31:05", utils.USAGE: "1048576", } @@ -124,7 +124,7 @@ func TestSMGDataLastUsedData(t *testing.T) { smgEv = SMGenericEvent{ utils.EVENT_NAME: "TEST_EVENT", utils.TOR: utils.DATA, - utils.ACCID: "12349", + utils.ACCID: "123491", utils.DIRECTION: utils.OUT, utils.ACCOUNT: "1010", utils.SUBJECT: "1010", @@ -132,6 +132,8 @@ func TestSMGDataLastUsedData(t *testing.T) { utils.CATEGORY: "data", utils.TENANT: "cgrates.org", utils.REQTYPE: utils.META_PREPAID, + utils.SETUP_TIME: "2016-01-05 18:30:59", + utils.ANSWER_TIME: "2016-01-05 18:31:05", utils.USAGE: "1048576", utils.LastUsed: "20000", } @@ -150,7 +152,7 @@ func TestSMGDataLastUsedData(t *testing.T) { smgEv = SMGenericEvent{ utils.EVENT_NAME: "TEST_EVENT", utils.TOR: utils.DATA, - utils.ACCID: "12349", + utils.ACCID: "123491", utils.DIRECTION: utils.OUT, utils.ACCOUNT: "1010", utils.SUBJECT: "1010", @@ -158,6 +160,8 @@ func TestSMGDataLastUsedData(t *testing.T) { utils.CATEGORY: "data", utils.TENANT: "cgrates.org", utils.REQTYPE: utils.META_PREPAID, + utils.SETUP_TIME: "2016-01-05 18:30:59", + utils.ANSWER_TIME: "2016-01-05 18:31:05", utils.LastUsed: "0", } var rpl string @@ -187,7 +191,7 @@ func TestSMGDataLastUsedMultipleData(t *testing.T) { smgEv := SMGenericEvent{ utils.EVENT_NAME: "TEST_EVENT", utils.TOR: utils.DATA, - utils.ACCID: "12349", + utils.ACCID: "123492", utils.DIRECTION: utils.OUT, utils.ACCOUNT: "1010", utils.SUBJECT: "1010", @@ -195,7 +199,7 @@ func TestSMGDataLastUsedMultipleData(t *testing.T) { utils.CATEGORY: "data", utils.TENANT: "cgrates.org", utils.REQTYPE: utils.META_PREPAID, - utils.SETUP_TIME: "2016-01-05 18:30:49", + utils.SETUP_TIME: "2016-01-05 18:30:50", utils.ANSWER_TIME: "2016-01-05 18:31:05", utils.USAGE: "1048576", } @@ -221,7 +225,7 @@ func TestSMGDataLastUsedMultipleData(t *testing.T) { smgEv = SMGenericEvent{ utils.EVENT_NAME: "TEST_EVENT", utils.TOR: utils.DATA, - utils.ACCID: "12349", + utils.ACCID: "123492", utils.DIRECTION: utils.OUT, utils.ACCOUNT: "1010", utils.SUBJECT: "1010", @@ -252,7 +256,7 @@ func TestSMGDataLastUsedMultipleData(t *testing.T) { smgEv = SMGenericEvent{ utils.EVENT_NAME: "TEST_EVENT", utils.TOR: utils.DATA, - utils.ACCID: "12349", + utils.ACCID: "123492", utils.DIRECTION: utils.OUT, utils.ACCOUNT: "1010", utils.SUBJECT: "1010", @@ -283,7 +287,7 @@ func TestSMGDataLastUsedMultipleData(t *testing.T) { smgEv = SMGenericEvent{ utils.EVENT_NAME: "TEST_EVENT", utils.TOR: utils.DATA, - utils.ACCID: "12349", + utils.ACCID: "123492", utils.DIRECTION: utils.OUT, utils.ACCOUNT: "1010", utils.SUBJECT: "1010", @@ -314,7 +318,7 @@ func TestSMGDataLastUsedMultipleData(t *testing.T) { smgEv = SMGenericEvent{ utils.EVENT_NAME: "TEST_EVENT", utils.TOR: utils.DATA, - utils.ACCID: "12349", + utils.ACCID: "123492", utils.DIRECTION: utils.OUT, utils.ACCOUNT: "1010", utils.SUBJECT: "1010", @@ -345,7 +349,7 @@ func TestSMGDataLastUsedMultipleData(t *testing.T) { smgEv = SMGenericEvent{ utils.EVENT_NAME: "TEST_EVENT", utils.TOR: utils.DATA, - utils.ACCID: "12349", + utils.ACCID: "123492", utils.DIRECTION: utils.OUT, utils.ACCOUNT: "1010", utils.SUBJECT: "1010", @@ -387,7 +391,7 @@ func TestSMGDataDerivedChargingNoCredit(t *testing.T) { smgEv := SMGenericEvent{ utils.EVENT_NAME: "TEST_EVENT", utils.TOR: utils.VOICE, - utils.ACCID: "12349", + utils.ACCID: "1234967", utils.DIRECTION: utils.OUT, utils.ACCOUNT: "1011", utils.SUBJECT: "1011", @@ -403,6 +407,8 @@ func TestSMGDataDerivedChargingNoCredit(t *testing.T) { if err := smgRPC.Call("SMGenericV1.SessionStart", smgEv, &maxUsage); err != nil { t.Error(err) } + // the second derived charging run has no credit + if maxUsage != 0 { t.Error("Bad max usage: ", maxUsage) } @@ -429,7 +435,7 @@ func TestSMGDataTTLExpired(t *testing.T) { smgEv := SMGenericEvent{ utils.EVENT_NAME: "TEST_EVENT", utils.TOR: utils.DATA, - utils.ACCID: "12349", + utils.ACCID: "123494", utils.DIRECTION: utils.OUT, utils.ACCOUNT: "1010", utils.SUBJECT: "1010", @@ -437,7 +443,7 @@ func TestSMGDataTTLExpired(t *testing.T) { utils.CATEGORY: "data", utils.TENANT: "cgrates.org", utils.REQTYPE: utils.META_PREPAID, - utils.SETUP_TIME: "2016-01-05 18:30:49", + utils.SETUP_TIME: "2016-01-05 18:30:52", utils.ANSWER_TIME: "2016-01-05 18:31:05", utils.USAGE: "1048576", } @@ -478,7 +484,7 @@ func TestSMGDataTTLExpiredMultiUpdates(t *testing.T) { smgEv := SMGenericEvent{ utils.EVENT_NAME: "TEST_EVENT", utils.TOR: utils.DATA, - utils.ACCID: "12349", + utils.ACCID: "123495", utils.DIRECTION: utils.OUT, utils.ACCOUNT: "1010", utils.SUBJECT: "1010", @@ -486,7 +492,7 @@ func TestSMGDataTTLExpiredMultiUpdates(t *testing.T) { utils.CATEGORY: "data", utils.TENANT: "cgrates.org", utils.REQTYPE: utils.META_PREPAID, - utils.SETUP_TIME: "2016-01-05 18:30:49", + utils.SETUP_TIME: "2016-01-05 18:30:53", utils.ANSWER_TIME: "2016-01-05 18:31:05", utils.USAGE: "1048576", } @@ -513,7 +519,7 @@ func TestSMGDataTTLExpiredMultiUpdates(t *testing.T) { smgEv = SMGenericEvent{ utils.EVENT_NAME: "TEST_EVENT", utils.TOR: utils.DATA, - utils.ACCID: "12349", + utils.ACCID: "123495", utils.DIRECTION: utils.OUT, utils.ACCOUNT: "1010", utils.SUBJECT: "1010", @@ -566,7 +572,7 @@ func TestSMGDataMultipleDataNoUsage(t *testing.T) { smgEv := SMGenericEvent{ utils.EVENT_NAME: "TEST_EVENT", utils.TOR: utils.DATA, - utils.ACCID: "12349", + utils.ACCID: "123496", utils.DIRECTION: utils.OUT, utils.ACCOUNT: "1010", utils.SUBJECT: "1010", @@ -574,7 +580,7 @@ func TestSMGDataMultipleDataNoUsage(t *testing.T) { utils.CATEGORY: "data", utils.TENANT: "cgrates.org", utils.REQTYPE: utils.META_PREPAID, - utils.SETUP_TIME: "2016-01-05 18:30:49", + utils.SETUP_TIME: "2016-01-05 18:30:54", utils.ANSWER_TIME: "2016-01-05 18:31:05", utils.USAGE: "1048576", } @@ -600,7 +606,7 @@ func TestSMGDataMultipleDataNoUsage(t *testing.T) { smgEv = SMGenericEvent{ utils.EVENT_NAME: "TEST_EVENT", utils.TOR: utils.DATA, - utils.ACCID: "12349", + utils.ACCID: "123496", utils.DIRECTION: utils.OUT, utils.ACCOUNT: "1010", utils.SUBJECT: "1010", @@ -631,7 +637,7 @@ func TestSMGDataMultipleDataNoUsage(t *testing.T) { smgEv = SMGenericEvent{ utils.EVENT_NAME: "TEST_EVENT", utils.TOR: utils.DATA, - utils.ACCID: "12349", + utils.ACCID: "123496", utils.DIRECTION: utils.OUT, utils.ACCOUNT: "1010", utils.SUBJECT: "1010", @@ -662,7 +668,7 @@ func TestSMGDataMultipleDataNoUsage(t *testing.T) { smgEv = SMGenericEvent{ utils.EVENT_NAME: "TEST_EVENT", utils.TOR: utils.DATA, - utils.ACCID: "12349", + utils.ACCID: "123496", utils.DIRECTION: utils.OUT, utils.ACCOUNT: "1010", utils.SUBJECT: "1010", @@ -693,7 +699,7 @@ func TestSMGDataMultipleDataNoUsage(t *testing.T) { smgEv = SMGenericEvent{ utils.EVENT_NAME: "TEST_EVENT", utils.TOR: utils.DATA, - utils.ACCID: "12349", + utils.ACCID: "123496", utils.DIRECTION: utils.OUT, utils.ACCOUNT: "1010", utils.SUBJECT: "1010", @@ -724,7 +730,7 @@ func TestSMGDataMultipleDataNoUsage(t *testing.T) { smgEv = SMGenericEvent{ utils.EVENT_NAME: "TEST_EVENT", utils.TOR: utils.DATA, - utils.ACCID: "12349", + utils.ACCID: "123496", utils.DIRECTION: utils.OUT, utils.ACCOUNT: "1010", utils.SUBJECT: "1010", @@ -766,7 +772,7 @@ func TestSMGDataMultipleDataConstantUsage(t *testing.T) { smgEv := SMGenericEvent{ utils.EVENT_NAME: "TEST_EVENT", utils.TOR: utils.DATA, - utils.ACCID: "12349", + utils.ACCID: "123497", utils.DIRECTION: utils.OUT, utils.ACCOUNT: "1010", utils.SUBJECT: "1010", @@ -774,7 +780,7 @@ func TestSMGDataMultipleDataConstantUsage(t *testing.T) { utils.CATEGORY: "data", utils.TENANT: "cgrates.org", utils.REQTYPE: utils.META_PREPAID, - utils.SETUP_TIME: "2016-01-05 18:30:49", + utils.SETUP_TIME: "2016-01-05 18:30:55", utils.ANSWER_TIME: "2016-01-05 18:31:05", utils.USAGE: "1048576", } @@ -801,7 +807,7 @@ func TestSMGDataMultipleDataConstantUsage(t *testing.T) { smgEv = SMGenericEvent{ utils.EVENT_NAME: "TEST_EVENT", utils.TOR: utils.DATA, - utils.ACCID: "12349", + utils.ACCID: "123497", utils.DIRECTION: utils.OUT, utils.ACCOUNT: "1010", utils.SUBJECT: "1010", @@ -832,7 +838,7 @@ func TestSMGDataMultipleDataConstantUsage(t *testing.T) { smgEv = SMGenericEvent{ utils.EVENT_NAME: "TEST_EVENT", utils.TOR: utils.DATA, - utils.ACCID: "12349", + utils.ACCID: "123497", utils.DIRECTION: utils.OUT, utils.ACCOUNT: "1010", utils.SUBJECT: "1010", @@ -863,7 +869,7 @@ func TestSMGDataMultipleDataConstantUsage(t *testing.T) { smgEv = SMGenericEvent{ utils.EVENT_NAME: "TEST_EVENT", utils.TOR: utils.DATA, - utils.ACCID: "12349", + utils.ACCID: "123497", utils.DIRECTION: utils.OUT, utils.ACCOUNT: "1010", utils.SUBJECT: "1010", @@ -894,7 +900,7 @@ func TestSMGDataMultipleDataConstantUsage(t *testing.T) { smgEv = SMGenericEvent{ utils.EVENT_NAME: "TEST_EVENT", utils.TOR: utils.DATA, - utils.ACCID: "12349", + utils.ACCID: "123497", utils.DIRECTION: utils.OUT, utils.ACCOUNT: "1010", utils.SUBJECT: "1010", @@ -925,7 +931,7 @@ func TestSMGDataMultipleDataConstantUsage(t *testing.T) { smgEv = SMGenericEvent{ utils.EVENT_NAME: "TEST_EVENT", utils.TOR: utils.DATA, - utils.ACCID: "12349", + utils.ACCID: "123497", utils.DIRECTION: utils.OUT, utils.ACCOUNT: "1010", utils.SUBJECT: "1010", diff --git a/sessionmanager/smg_it_test.go b/sessionmanager/smg_it_test.go index 07bcdffc2..b14e4adf0 100644 --- a/sessionmanager/smg_it_test.go +++ b/sessionmanager/smg_it_test.go @@ -117,7 +117,7 @@ func TestSMGVoiceMonetaryRefund(t *testing.T) { smgEv := SMGenericEvent{ utils.EVENT_NAME: "TEST_EVENT", utils.TOR: utils.VOICE, - utils.ACCID: "12345", + utils.ACCID: "123451", utils.DIRECTION: utils.OUT, utils.ACCOUNT: "1001", utils.SUBJECT: "1001", @@ -147,7 +147,7 @@ func TestSMGVoiceMonetaryRefund(t *testing.T) { smgEv = SMGenericEvent{ utils.EVENT_NAME: "TEST_EVENT", utils.TOR: utils.VOICE, - utils.ACCID: "12345", + utils.ACCID: "123451", utils.DIRECTION: utils.OUT, utils.ACCOUNT: "1001", utils.SUBJECT: "1001", @@ -178,7 +178,7 @@ func TestSMGVoiceVoiceRefund(t *testing.T) { smgEv := SMGenericEvent{ utils.EVENT_NAME: "TEST_EVENT", utils.TOR: utils.VOICE, - utils.ACCID: "12345", + utils.ACCID: "123452", utils.DIRECTION: utils.OUT, utils.ACCOUNT: "1001", utils.SUBJECT: "1001", @@ -208,7 +208,7 @@ func TestSMGVoiceVoiceRefund(t *testing.T) { smgEv = SMGenericEvent{ utils.EVENT_NAME: "TEST_EVENT", utils.TOR: utils.VOICE, - utils.ACCID: "12345", + utils.ACCID: "123452", utils.DIRECTION: utils.OUT, utils.ACCOUNT: "1001", utils.SUBJECT: "1001", @@ -246,7 +246,7 @@ func TestSMGVoiceMixedRefund(t *testing.T) { smgEv := SMGenericEvent{ utils.EVENT_NAME: "TEST_EVENT", utils.TOR: utils.VOICE, - utils.ACCID: "12345", + utils.ACCID: "123453", utils.DIRECTION: utils.OUT, utils.ACCOUNT: "1001", utils.SUBJECT: "1001", @@ -278,7 +278,7 @@ func TestSMGVoiceMixedRefund(t *testing.T) { smgEv = SMGenericEvent{ utils.EVENT_NAME: "TEST_EVENT", utils.TOR: utils.VOICE, - utils.ACCID: "12345", + utils.ACCID: "123453", utils.DIRECTION: utils.OUT, utils.ACCOUNT: "1001", utils.SUBJECT: "1001", @@ -438,7 +438,7 @@ func TestSMGVoiceLastUsedEnd(t *testing.T) { smgEv := SMGenericEvent{ utils.EVENT_NAME: "TEST_EVENT", utils.TOR: utils.VOICE, - utils.ACCID: "12349", + utils.ACCID: "1234911", utils.DIRECTION: utils.OUT, utils.ACCOUNT: "1001", utils.SUBJECT: "1001", @@ -466,7 +466,7 @@ func TestSMGVoiceLastUsedEnd(t *testing.T) { smgEv = SMGenericEvent{ utils.EVENT_NAME: "TEST_EVENT", utils.TOR: utils.VOICE, - utils.ACCID: "12349", + utils.ACCID: "1234911", utils.DIRECTION: utils.OUT, utils.ACCOUNT: "1001", utils.SUBJECT: "1001", @@ -492,7 +492,7 @@ func TestSMGVoiceLastUsedEnd(t *testing.T) { smgEv = SMGenericEvent{ utils.EVENT_NAME: "TEST_EVENT", utils.TOR: utils.VOICE, - utils.ACCID: "12349", + utils.ACCID: "1234911", utils.DIRECTION: utils.OUT, utils.ACCOUNT: "1001", utils.SUBJECT: "1001", @@ -529,7 +529,7 @@ func TestSMGVoiceLastUsedNotFixed(t *testing.T) { smgEv := SMGenericEvent{ utils.EVENT_NAME: "TEST_EVENT", utils.TOR: utils.VOICE, - utils.ACCID: "12349", + utils.ACCID: "1234922", utils.DIRECTION: utils.OUT, utils.ACCOUNT: "1001", utils.SUBJECT: "1001", @@ -557,7 +557,7 @@ func TestSMGVoiceLastUsedNotFixed(t *testing.T) { smgEv = SMGenericEvent{ utils.EVENT_NAME: "TEST_EVENT", utils.TOR: utils.VOICE, - utils.ACCID: "12349", + utils.ACCID: "1234922", utils.DIRECTION: utils.OUT, utils.ACCOUNT: "1001", utils.SUBJECT: "1001", @@ -583,7 +583,7 @@ func TestSMGVoiceLastUsedNotFixed(t *testing.T) { smgEv = SMGenericEvent{ utils.EVENT_NAME: "TEST_EVENT", utils.TOR: utils.VOICE, - utils.ACCID: "12349", + utils.ACCID: "1234922", utils.DIRECTION: utils.OUT, utils.ACCOUNT: "1001", utils.SUBJECT: "1001", diff --git a/sessionmanager/smg_session.go b/sessionmanager/smg_session.go index df622953b..bb7e73f01 100644 --- a/sessionmanager/smg_session.go +++ b/sessionmanager/smg_session.go @@ -192,8 +192,10 @@ func (self *SMGSession) refund(refundDuration time.Duration) error { if len(refundIncrements) > 0 { cd := firstCC.CreateCallDescriptor() cd.Increments = refundIncrements + cd.CgrID = self.cd.CgrID + cd.RunID = self.cd.RunID cd.Increments.Compress() - utils.Logger.Info(fmt.Sprintf("Refunding duration %v with cd: %s", initialRefundDuration, utils.ToJSON(cd))) + utils.Logger.Info(fmt.Sprintf("Refunding %s duration %v with incerements: %s", cd.CgrID, initialRefundDuration, utils.ToJSON(cd.Increments))) var response float64 err := self.rater.Call("Responder.RefundIncrements", cd, &response) if err != nil { @@ -253,6 +255,8 @@ func (self *SMGSession) saveOperations(originID string) error { roundIncrements := firstCC.GetRoundIncrements() if len(roundIncrements) != 0 { cd := firstCC.CreateCallDescriptor() + cd.CgrID = self.cd.CgrID + cd.RunID = self.cd.RunID cd.Increments = roundIncrements var response float64 if err := self.rater.Call("Responder.RefundRounding", cd, &response); err != nil { diff --git a/sessionmanager/smgeneric.go b/sessionmanager/smgeneric.go index 7fc17f5dc..b81c79d95 100644 --- a/sessionmanager/smgeneric.go +++ b/sessionmanager/smgeneric.go @@ -423,16 +423,10 @@ func (self *SMGeneric) ChargeEvent(gev SMGenericEvent, clnt *rpc2.Client) (maxDu } // refund cc if len(refundIncrements) > 0 { - cd := &engine.CallDescriptor{ - Direction: cc.Direction, - Tenant: cc.Tenant, - Category: cc.Category, - Subject: cc.Subject, - Account: cc.Account, - Destination: cc.Destination, - TOR: cc.TOR, - Increments: refundIncrements, - } + cd := cc.CreateCallDescriptor() + cd.Increments = refundIncrements + cd.CgrID = sR.CallDescriptor.CgrID + cd.RunID = sR.CallDescriptor.RunID cd.Increments.Compress() utils.Logger.Info(fmt.Sprintf("Refunding session run callcost: %s", utils.ToJSON(cd))) var response float64 diff --git a/utils/consts.go b/utils/consts.go index b5a720173..d5f800d04 100644 --- a/utils/consts.go +++ b/utils/consts.go @@ -242,6 +242,7 @@ const ( REFUND_INCR_CACHE_PREFIX = "REFUND_INCR_" REFUND_ROUND_CACHE_PREFIX = "REFUND_ROUND_" GET_SESS_RUNS_CACHE_PREFIX = "GET_SESS_RUNS_" + GET_DERIV_MAX_SESS_TIME = "GET_DERIV_MAX_SESS_TIME_" LOG_CALL_COST_CACHE_PREFIX = "LOG_CALL_COSTS_" LCRCachePrefix = "LCR_" ALIAS_CONTEXT_RATING = "*rating"