ChargeEvent returning maxUsage

This commit is contained in:
DanB
2016-01-20 13:49:53 +01:00
parent e106deaef3
commit 1dfbb86fb3
4 changed files with 22 additions and 19 deletions

View File

@@ -110,7 +110,7 @@ func (self DiameterAgent) processCCR(ccr *CCR, reqProcessor *config.DARequestPro
if ccr.CCRequestType == 3 {
err = self.smg.Call("SMGenericV1.SessionEnd", smgEv, &rpl)
} else if ccr.CCRequestType == 4 {
err = self.smg.Call("SMGenericV1.ChargeEvent", smgEv, &rpl)
err = self.smg.Call("SMGenericV1.ChargeEvent", smgEv, &maxUsage)
}
if self.cgrCfg.DiameterAgentCfg().CreateCDR {
if errCdr := self.smg.Call("SMGenericV1.ProcessCdr", smgEv, &rpl); errCdr != nil {
@@ -127,7 +127,7 @@ func (self DiameterAgent) processCCR(ccr *CCR, reqProcessor *config.DARequestPro
utils.Logger.Err(fmt.Sprintf("<DiameterAgent> Processing message: %+v, API error: %s", ccr.diamMessage, err))
return cca
}
if ccr.CCRequestType != 3 && maxUsage == 0 { // Not enough balance, RFC demands 4012
if ccr.CCRequestType != 3 && ccr.CCRequestType != 4 && maxUsage == 0 { // Not enough balance, RFC demands 4012
if err := messageSetAVPsWithPath(cca.diamMessage, []interface{}{"Result-Code"}, "4012",
false, self.cgrCfg.DiameterAgentCfg().Timezone); err != nil {
utils.Logger.Err(fmt.Sprintf("<DiameterAgent> Processing message: %+v set CCA Reply-Code, error: %s", ccr.diamMessage, err))

View File

@@ -100,11 +100,12 @@ func (self *SMGenericBiRpcV1) SessionEnd(clnt *rpc2.Client, ev sessionmanager.SM
}
// Called on individual Events (eg SMS)
func (self *SMGenericBiRpcV1) ChargeEvent(clnt *rpc2.Client, ev sessionmanager.SMGenericEvent, reply *string) error {
if err := self.sm.ChargeEvent(ev, clnt); err != nil {
func (self *SMGenericBiRpcV1) ChargeEvent(clnt *rpc2.Client, ev sessionmanager.SMGenericEvent, maxUsage *float64) error {
if minMaxUsage, err := self.sm.ChargeEvent(ev, clnt); err != nil {
return utils.NewErrServerError(err)
} else {
*maxUsage = minMaxUsage.Seconds()
}
*reply = utils.OK
return nil
}

View File

@@ -71,11 +71,12 @@ func (self *SMGenericV1) SessionEnd(ev sessionmanager.SMGenericEvent, reply *str
}
// Called on individual Events (eg SMS)
func (self *SMGenericV1) ChargeEvent(ev sessionmanager.SMGenericEvent, reply *string) error {
if err := self.sm.ChargeEvent(ev, nil); err != nil {
func (self *SMGenericV1) ChargeEvent(ev sessionmanager.SMGenericEvent, maxUsage *float64) error {
if minMaxUsage, err := self.sm.ChargeEvent(ev, nil); err != nil {
return utils.NewErrServerError(err)
} else {
*maxUsage = minMaxUsage.Seconds()
}
*reply = utils.OK
return nil
}
@@ -146,7 +147,7 @@ func (self *SMGenericV1) Call(serviceMethod string, args interface{}, reply inte
if !canConvert {
return rpcclient.ErrWrongArgsType
}
replyConverted, canConvert := reply.(*string)
replyConverted, canConvert := reply.(*float64)
if !canConvert {
return rpcclient.ErrWrongReplyType
}

View File

@@ -205,14 +205,13 @@ func (self *SMGeneric) SessionEnd(gev SMGenericEvent, clnt *rpc2.Client) error {
}
// Processes one time events (eg: SMS)
func (self *SMGeneric) ChargeEvent(gev SMGenericEvent, clnt *rpc2.Client) error {
func (self *SMGeneric) ChargeEvent(gev SMGenericEvent, clnt *rpc2.Client) (maxDur time.Duration, err error) {
var sessionRuns []*engine.SessionRun
if err := self.rater.GetSessionRuns(gev.AsStoredCdr(self.cgrCfg, self.timezone), &sessionRuns); err != nil {
return err
return nilDuration, err
} else if len(sessionRuns) == 0 {
return nil
return nilDuration, nil
}
var err error
for _, sR := range sessionRuns {
cc := new(engine.CallCost)
if err = self.rater.MaxDebit(sR.CallDescriptor, cc); err != nil {
@@ -220,19 +219,21 @@ func (self *SMGeneric) ChargeEvent(gev SMGenericEvent, clnt *rpc2.Client) error
break
}
sR.CallCosts = append(sR.CallCosts, cc) // Save it so we can revert on issues
if cc.GetDuration() == 0 {
if ccDur := cc.GetDuration(); ccDur == 0 {
err = errors.New("INSUFFICIENT_FUNDS")
break
} else if ccDur < maxDur {
maxDur = ccDur
}
}
if err != nil { // Refund the ones already taken since we have error on one of the debits
for _, sR := range sessionRuns {
for _, cc := range sR.CallCosts {
utils.Logger.Debug(fmt.Sprintf("%+v", cc))
continue // Refund here
utils.Logger.Debug(fmt.Sprintf("%+v", cc)) // Refund here
continue
}
}
return err
return nilDuration, err
}
var withErrors bool
for _, sR := range sessionRuns {
@@ -253,9 +254,9 @@ func (self *SMGeneric) ChargeEvent(gev SMGenericEvent, clnt *rpc2.Client) error
}
}
if withErrors {
return ErrPartiallyExecuted
return nilDuration, ErrPartiallyExecuted
}
return nil
return maxDur, nil
}
func (self *SMGeneric) ProcessCdr(gev SMGenericEvent) error {