SM-Generic - pass connection information from RPC

This commit is contained in:
DanB
2015-11-08 09:34:44 +01:00
parent a8af4e92b8
commit e83c5a4839
5 changed files with 53 additions and 32 deletions

View File

@@ -19,17 +19,19 @@ along with this program. If not, see <http://www.gnu.org/licenses/>
package v1
import (
"time"
"github.com/cenkalti/rpc2"
"github.com/cgrates/cgrates/sessionmanager"
"github.com/cgrates/cgrates/utils"
)
func NewSMGenericBiRpcV1(smRpc *SMGenericV1, sm *sessionmanager.GenericSessionManager) *SMGenericBiRpcV1 {
return &SMGenericBiRpcV1{smRpc: smRpc, sm: sm}
func NewSMGenericBiRpcV1(sm *sessionmanager.GenericSessionManager) *SMGenericBiRpcV1 {
return &SMGenericBiRpcV1{sm: sm}
}
type SMGenericBiRpcV1 struct {
smRpc *SMGenericV1
sm *sessionmanager.GenericSessionManager
sm *sessionmanager.GenericSessionManager
}
// Publishes methods exported by SMGenericBiRpcV1 as SMGenericV1 (so we can handle standard RPC methods via birpc socket)
@@ -43,27 +45,50 @@ func (self *SMGenericBiRpcV1) Handlers() map[string]interface{} {
}
}
// Returns MaxUsage (for calls in seconds), -1 for no limit
func (self *SMGenericBiRpcV1) GetMaxUsage(client *rpc2.Client, ev sessionmanager.GenericEvent, maxUsage *float64) error {
return self.smRpc.GetMaxUsage(ev, maxUsage)
/// Returns MaxUsage (for calls in seconds), -1 for no limit
func (self *SMGenericBiRpcV1) GetMaxUsage(clnt *rpc2.Client, ev sessionmanager.GenericEvent, maxUsage *float64) error {
maxUsageDur, err := self.sm.GetMaxUsage(ev, clnt)
if err != nil {
return utils.NewErrServerError(err)
}
if maxUsageDur == time.Duration(-1) {
*maxUsage = -1.0
} else {
*maxUsage = maxUsageDur.Seconds()
}
return nil
}
// Called on session start, returns the maximum number of seconds the session can last
func (self *SMGenericBiRpcV1) SessionStart(client *rpc2.Client, ev sessionmanager.GenericEvent, maxUsage *float64) error {
return self.smRpc.SessionStart(ev, maxUsage)
func (self *SMGenericBiRpcV1) SessionStart(clnt *rpc2.Client, ev sessionmanager.GenericEvent, maxUsage *float64) error {
if err := self.sm.SessionStart(ev, clnt); err != nil {
return utils.NewErrServerError(err)
}
return self.GetMaxUsage(clnt, ev, maxUsage)
}
// Interim updates, returns remaining duration from the rater
func (self *SMGenericBiRpcV1) SessionUpdate(client *rpc2.Client, ev sessionmanager.GenericEvent, maxUsage *float64) error {
return self.smRpc.SessionUpdate(ev, maxUsage)
func (self *SMGenericBiRpcV1) SessionUpdate(clnt *rpc2.Client, ev sessionmanager.GenericEvent, maxUsage *float64) error {
if err := self.sm.SessionUpdate(ev, clnt); err != nil {
return utils.NewErrServerError(err)
}
return self.GetMaxUsage(clnt, ev, maxUsage)
}
// Called on session end, should stop debit loop
func (self *SMGenericBiRpcV1) SessionEnd(client *rpc2.Client, ev sessionmanager.GenericEvent, reply *string) error {
return self.smRpc.SessionEnd(ev, reply)
func (self *SMGenericBiRpcV1) SessionEnd(clnt *rpc2.Client, ev sessionmanager.GenericEvent, reply *string) error {
if err := self.sm.SessionEnd(ev, clnt); err != nil {
return utils.NewErrServerError(err)
}
*reply = utils.OK
return nil
}
// Called on session end, should send the CDR to CDRS
func (self *SMGenericBiRpcV1) ProcessCdr(client *rpc2.Client, ev sessionmanager.GenericEvent, reply *string) error {
return self.smRpc.ProcessCdr(ev, reply)
func (self *SMGenericBiRpcV1) ProcessCdr(clnt *rpc2.Client, ev sessionmanager.GenericEvent, reply *string) error {
if err := self.sm.ProcessCdr(ev); err != nil {
return utils.NewErrServerError(err)
}
*reply = utils.OK
return nil
}

View File

@@ -3,7 +3,6 @@ package v1
import (
"time"
"github.com/cgrates/cgrates/config"
"github.com/cgrates/cgrates/sessionmanager"
"github.com/cgrates/cgrates/utils"
)
@@ -19,7 +18,7 @@ type SMGenericV1 struct {
// Returns MaxUsage (for calls in seconds), -1 for no limit
func (self *SMGenericV1) GetMaxUsage(ev sessionmanager.GenericEvent, maxUsage *float64) error {
maxUsageDur, err := self.sm.GetMaxUsage(ev)
maxUsageDur, err := self.sm.GetMaxUsage(ev, nil)
if err != nil {
return utils.NewErrServerError(err)
}
@@ -33,7 +32,7 @@ func (self *SMGenericV1) GetMaxUsage(ev sessionmanager.GenericEvent, maxUsage *f
// Called on session start, returns the maximum number of seconds the session can last
func (self *SMGenericV1) SessionStart(ev sessionmanager.GenericEvent, maxUsage *float64) error {
if err := self.sm.SessionStart(ev); err != nil {
if err := self.sm.SessionStart(ev, nil); err != nil {
return utils.NewErrServerError(err)
}
return self.GetMaxUsage(ev, maxUsage)
@@ -41,7 +40,7 @@ func (self *SMGenericV1) SessionStart(ev sessionmanager.GenericEvent, maxUsage *
// Interim updates, returns remaining duration from the rater
func (self *SMGenericV1) SessionUpdate(ev sessionmanager.GenericEvent, maxUsage *float64) error {
if err := self.sm.SessionUpdate(ev); err != nil {
if err := self.sm.SessionUpdate(ev, nil); err != nil {
return utils.NewErrServerError(err)
}
return self.GetMaxUsage(ev, maxUsage)
@@ -49,7 +48,7 @@ func (self *SMGenericV1) SessionUpdate(ev sessionmanager.GenericEvent, maxUsage
// Called on session end, should stop debit loop
func (self *SMGenericV1) SessionEnd(ev sessionmanager.GenericEvent, reply *string) error {
if err := self.sm.SessionEnd(ev); err != nil {
if err := self.sm.SessionEnd(ev, nil); err != nil {
return utils.NewErrServerError(err)
}
*reply = utils.OK
@@ -58,11 +57,7 @@ func (self *SMGenericV1) SessionEnd(ev sessionmanager.GenericEvent, reply *strin
// Called on session end, should send the CDR to CDRS
func (self *SMGenericV1) ProcessCdr(ev sessionmanager.GenericEvent, reply *string) error {
cdr, err := ev.AsStoredCdr(config.CgrConfig().DefaultTimezone)
if err != nil {
return utils.NewErrServerError(err)
}
if err := self.sm.ProcessCdr(cdr); err != nil {
if err := self.sm.ProcessCdr(ev); err != nil {
return utils.NewErrServerError(err)
}
*reply = utils.OK

View File

@@ -185,7 +185,7 @@ func startSmGeneric(internalRaterChan chan *engine.Responder, server *utils.Serv
smgRpc := v1.NewSMGenericV1(sm)
server.RpcRegister(smgRpc)
// Register BiRpc handlers
smgBiRpc := v1.NewSMGenericBiRpcV1(smgRpc, sm)
smgBiRpc := v1.NewSMGenericBiRpcV1(sm)
for method, handler := range smgBiRpc.Handlers() {
server.BijsonRegisterName(method, handler)
}

View File

@@ -80,7 +80,9 @@ func (self *GenericSessionManager) OnClientDisconnect(clnt *rpc2.Client) {
}
}
func (self *GenericSessionManager) GetMaxUsage(ev GenericEvent) (time.Duration, error) {
// Methods to apply on sessions, mostly exported through RPC/Bi-RPC
//Calculates maximum usage allowed for event
func (self *GenericSessionManager) GetMaxUsage(ev GenericEvent, clnt *rpc2.Client) (time.Duration, error) {
storedCdr, err := ev.AsStoredCdr(self.timezone)
if err != nil {
return time.Duration(0), err
@@ -93,17 +95,17 @@ func (self *GenericSessionManager) GetMaxUsage(ev GenericEvent) (time.Duration,
}
// Called on session start
func (self *GenericSessionManager) SessionStart(ev GenericEvent) error {
func (self *GenericSessionManager) SessionStart(ev GenericEvent, clnt *rpc2.Client) error {
return nil
}
// Interim updates
func (self *GenericSessionManager) SessionUpdate(ev GenericEvent) error {
func (self *GenericSessionManager) SessionUpdate(ev GenericEvent, clnt *rpc2.Client) error {
return nil
}
// Called on session end, should stop debit loop
func (self *GenericSessionManager) SessionEnd(ev GenericEvent) error {
func (self *GenericSessionManager) SessionEnd(ev GenericEvent, clnt *rpc2.Client) error {
return nil
}
@@ -134,7 +136,7 @@ func (self *GenericSessionManager) Timezone() string {
return self.timezone
}
func (self *GenericSessionManager) ProcessCdr(cdr *engine.StoredCdr) error {
func (self *GenericSessionManager) ProcessCdr(ev GenericEvent) error {
return nil
}

View File

@@ -32,7 +32,6 @@ type SessionManager interface {
WarnSessionMinDuration(string, string)
Sessions() []*Session
Timezone() string
ProcessCdr(*engine.StoredCdr) error
Connect() error
Shutdown() error
//RemoveSession(string)