From 6c79fd209282cd19a7d19d3f1f26990ef611dc35 Mon Sep 17 00:00:00 2001 From: Radu Ioan Fericean Date: Wed, 24 Jul 2013 13:38:45 +0300 Subject: [PATCH] rater lib changed to engine --- apier/apier.go | 32 ++++---- apier/tpaccountactions.go | 6 +- apier/tpactiontriggers.go | 8 +- apier/tpdestinations.go | 4 +- apier/tptimings.go | 4 +- cdrs/cdrs.go | 10 +-- cmd/cgr-engine/cgr-engine.go | 82 +++++++++---------- cmd/cgr-engine/registration.go | 28 +++---- cmd/cgr-loader/cgr-loader.go | 20 ++--- cmd/stress/cgr-raterstress/cgr-raterstress.go | 8 +- cmd/stress/cgr-spansstress/cgr-spansstress.go | 12 +-- console/balance.go | 10 +-- docs/architecture.rst | 10 +-- docs/configuration.rst | 4 +- docs/freeswitch.rst | 2 +- {rater => engine}/accountlock.go | 2 +- {rater => engine}/accountlock_test.go | 2 +- {rater => engine}/action.go | 2 +- {rater => engine}/action_timing.go | 2 +- {rater => engine}/action_trigger.go | 2 +- {rater => engine}/actions_test.go | 2 +- {rater => engine}/activationperiod.go | 2 +- {rater => engine}/activationperiod_test.go | 2 +- {rater => engine}/callcost.go | 2 +- {rater => engine}/callcost_test.go | 2 +- {rater => engine}/calldesc.go | 2 +- {rater => engine}/calldesc_test.go | 2 +- {rater => engine}/dateseries.go | 2 +- {rater => engine}/dateseries_test.go | 2 +- {rater => engine}/destinations.go | 2 +- {rater => engine}/destinations_test.go | 2 +- {rater => engine}/interval.go | 2 +- {rater => engine}/interval_test.go | 2 +- {rater => engine}/loader_csv.go | 2 +- {rater => engine}/loader_csv_test.go | 2 +- {rater => engine}/loader_db.go | 2 +- {rater => engine}/loader_helpers.go | 2 +- {rater => engine}/minute_buckets.go | 2 +- {rater => engine}/minute_buckets_test.go | 2 +- {rater => engine}/ratingprofile.go | 2 +- {rater => engine}/ratingprofile_test.go | 2 +- {rater => engine}/responder.go | 2 +- {rater => engine}/simple_serializer.go | 2 +- {rater => engine}/simple_serializer_test.go | 2 +- {rater => engine}/storage_interface.go | 2 +- {rater => engine}/storage_map.go | 2 +- {rater => engine}/storage_mongo.go | 2 +- {rater => engine}/storage_mysql.go | 2 +- {rater => engine}/storage_postgres.go | 2 +- {rater => engine}/storage_redis.go | 2 +- {rater => engine}/storage_sql.go | 2 +- {rater => engine}/storage_utils.go | 2 +- {rater => engine}/timespans.go | 2 +- {rater => engine}/timespans_test.go | 2 +- {rater => engine}/tpimporter_csv.go | 2 +- {rater => engine}/units_counter.go | 2 +- {rater => engine}/units_counter_test.go | 2 +- {rater => engine}/userbalance.go | 2 +- {rater => engine}/userbalance_test.go | 2 +- mediator/mediator.go | 48 +++++------ scheduler/scheduler.go | 20 ++--- sessionmanager/fssessionmanager.go | 80 +++++++++--------- sessionmanager/session.go | 22 ++--- sessionmanager/sessionmanager.go | 6 +- 64 files changed, 252 insertions(+), 252 deletions(-) rename {rater => engine}/accountlock.go (99%) rename {rater => engine}/accountlock_test.go (98%) rename {rater => engine}/action.go (99%) rename {rater => engine}/action_timing.go (99%) rename {rater => engine}/action_trigger.go (99%) rename {rater => engine}/actions_test.go (99%) rename {rater => engine}/activationperiod.go (99%) rename {rater => engine}/activationperiod_test.go (99%) rename {rater => engine}/callcost.go (99%) rename {rater => engine}/callcost_test.go (99%) rename {rater => engine}/calldesc.go (99%) rename {rater => engine}/calldesc_test.go (99%) rename {rater => engine}/dateseries.go (99%) rename {rater => engine}/dateseries_test.go (99%) rename {rater => engine}/destinations.go (99%) rename {rater => engine}/destinations_test.go (99%) rename {rater => engine}/interval.go (99%) rename {rater => engine}/interval_test.go (99%) rename {rater => engine}/loader_csv.go (99%) rename {rater => engine}/loader_csv_test.go (99%) rename {rater => engine}/loader_db.go (99%) rename {rater => engine}/loader_helpers.go (99%) rename {rater => engine}/minute_buckets.go (99%) rename {rater => engine}/minute_buckets_test.go (99%) rename {rater => engine}/ratingprofile.go (99%) rename {rater => engine}/ratingprofile_test.go (99%) rename {rater => engine}/responder.go (99%) rename {rater => engine}/simple_serializer.go (99%) rename {rater => engine}/simple_serializer_test.go (99%) rename {rater => engine}/storage_interface.go (99%) rename {rater => engine}/storage_map.go (99%) rename {rater => engine}/storage_mongo.go (99%) rename {rater => engine}/storage_mysql.go (98%) rename {rater => engine}/storage_postgres.go (98%) rename {rater => engine}/storage_redis.go (99%) rename {rater => engine}/storage_sql.go (99%) rename {rater => engine}/storage_utils.go (99%) rename {rater => engine}/timespans.go (99%) rename {rater => engine}/timespans_test.go (99%) rename {rater => engine}/tpimporter_csv.go (98%) rename {rater => engine}/units_counter.go (99%) rename {rater => engine}/units_counter_test.go (99%) rename {rater => engine}/userbalance.go (99%) rename {rater => engine}/userbalance_test.go (99%) diff --git a/apier/apier.go b/apier/apier.go index 78e0859aa..4b1146cab 100644 --- a/apier/apier.go +++ b/apier/apier.go @@ -21,14 +21,14 @@ package apier import ( "errors" "fmt" - "github.com/cgrates/cgrates/rater" + "github.com/cgrates/cgrates/engine" "github.com/cgrates/cgrates/scheduler" "github.com/cgrates/cgrates/utils" ) type Apier struct { - StorDb rater.DataStorage - DataDb rater.DataStorage + StorDb engine.DataStorage + DataDb engine.DataStorage Sched *scheduler.Scheduler } @@ -63,7 +63,7 @@ func (self *Apier) GetBalance(attr *AttrGetBalance, reply *float64) error { } if attr.Direction == "" { - attr.Direction = rater.OUTBOUND + attr.Direction = engine.OUTBOUND } if balance, balExists := userBalance.BalanceMap[attr.BalanceId+attr.Direction]; !balExists { @@ -88,7 +88,7 @@ func (self *Apier) AddBalance(attr *AttrAddBalance, reply *float64) error { if _, err := self.DataDb.GetUserBalance(tag); err != nil { // create user balance if not exists - ub := &rater.UserBalance{ + ub := &engine.UserBalance{ Id: tag, } if err := self.DataDb.SetUserBalance(ub); err != nil { @@ -96,15 +96,15 @@ func (self *Apier) AddBalance(attr *AttrAddBalance, reply *float64) error { } } - at := &rater.ActionTiming{ + at := &engine.ActionTiming{ UserBalanceIds: []string{tag}, } if attr.Direction == "" { - attr.Direction = rater.OUTBOUND + attr.Direction = engine.OUTBOUND } - at.SetActions(rater.Actions{&rater.Action{ActionType: rater.TOPUP, BalanceId: attr.BalanceId, Direction: attr.Direction, Units: attr.Value}}) + at.SetActions(engine.Actions{&engine.Action{ActionType: engine.TOPUP, BalanceId: attr.BalanceId, Direction: attr.Direction, Units: attr.Value}}) if err := at.Execute(); err != nil { return err @@ -122,7 +122,7 @@ type AttrExecuteAction struct { func (self *Apier) ExecuteAction(attr *AttrExecuteAction, reply *float64) error { tag := fmt.Sprintf("%s:%s:%s", attr.Direction, attr.Tenant, attr.Account) - at := &rater.ActionTiming{ + at := &engine.ActionTiming{ UserBalanceIds: []string{tag}, ActionsId: attr.ActionsId, } @@ -144,7 +144,7 @@ func (self *Apier) SetRatingProfile(attrs AttrSetRatingProfile, reply *string) e if missing := utils.MissingStructFields(&attrs, []string{"TPid", "RateProfileId"}); len(missing) != 0 { return fmt.Errorf("%s:%v", utils.ERR_MANDATORY_IE_MISSING, missing) } - dbReader := rater.NewDbReader(self.StorDb, self.DataDb, attrs.TPid) + dbReader := engine.NewDbReader(self.StorDb, self.DataDb, attrs.TPid) if err := dbReader.LoadRatingProfileByTag(attrs.RateProfileId); err != nil { return fmt.Errorf("%s:%s", utils.ERR_SERVER_ERROR, err.Error()) @@ -167,10 +167,10 @@ type AttrActionTrigger struct { func (self *Apier) AddTriggeredAction(attr AttrActionTrigger, reply *float64) error { if attr.Direction == "" { - attr.Direction = rater.OUTBOUND + attr.Direction = engine.OUTBOUND } - at := &rater.ActionTrigger{ + at := &engine.ActionTrigger{ Id: utils.GenUUID(), BalanceId: attr.BalanceId, Direction: attr.Direction, @@ -183,7 +183,7 @@ func (self *Apier) AddTriggeredAction(attr AttrActionTrigger, reply *float64) er tag := fmt.Sprintf("%s:%s:%s", attr.Direction, attr.Tenant, attr.Account) var dbErr error - rater.AccLock.Guard(tag, func() (float64, error) { + engine.AccLock.Guard(tag, func() (float64, error) { userBalance, err := self.DataDb.GetUserBalance(tag) if err != nil { dbErr = err @@ -216,7 +216,7 @@ func (self *Apier) AddAccount(attr *AttrAccount, reply *float64) error { return fmt.Errorf("%s:%v", utils.ERR_MANDATORY_IE_MISSING, missing) } tag := fmt.Sprintf("%s:%s:%s", attr.Direction, attr.Tenant, attr.Account) - ub := &rater.UserBalance{ + ub := &engine.UserBalance{ Id: tag, Type: attr.Type, } @@ -253,9 +253,9 @@ func (self *Apier) SetAccountActions(attrs AttrSetAccountActions, reply *string) if missing := utils.MissingStructFields(&attrs, []string{"TPid", "AccountActionsId"}); len(missing) != 0 { return fmt.Errorf("%s:%v", utils.ERR_MANDATORY_IE_MISSING, missing) } - dbReader := rater.NewDbReader(self.StorDb, self.DataDb, attrs.TPid) + dbReader := engine.NewDbReader(self.StorDb, self.DataDb, attrs.TPid) - if _, err := rater.AccLock.Guard(attrs.AccountActionsId, func() (float64, error) { + if _, err := engine.AccLock.Guard(attrs.AccountActionsId, func() (float64, error) { if err := dbReader.LoadAccountActionsByTag(attrs.AccountActionsId); err != nil { return 0, err } diff --git a/apier/tpaccountactions.go b/apier/tpaccountactions.go index 52f409b3a..69681f055 100644 --- a/apier/tpaccountactions.go +++ b/apier/tpaccountactions.go @@ -21,7 +21,7 @@ package apier import ( "errors" "fmt" - "github.com/cgrates/cgrates/rater" + "github.com/cgrates/cgrates/engine" "github.com/cgrates/cgrates/utils" ) @@ -37,8 +37,8 @@ func (self *Apier) SetTPAccountActions(attrs utils.ApiTPAccountActions, reply *s } else if exists { return errors.New(utils.ERR_DUPLICATE) } - aa := map[string]*rater.AccountAction{ - attrs.AccountActionsId: &rater.AccountAction{Tenant: attrs.Tenant, Account: attrs.Account, Direction: attrs.Direction, + aa := map[string]*engine.AccountAction{ + attrs.AccountActionsId: &engine.AccountAction{Tenant: attrs.Tenant, Account: attrs.Account, Direction: attrs.Direction, ActionTimingsTag: attrs.ActionTimingsId, ActionTriggersTag: attrs.ActionTriggersId}, } diff --git a/apier/tpactiontriggers.go b/apier/tpactiontriggers.go index 021f7b213..6b1bd4056 100644 --- a/apier/tpactiontriggers.go +++ b/apier/tpactiontriggers.go @@ -21,7 +21,7 @@ package apier import ( "errors" "fmt" - "github.com/cgrates/cgrates/rater" + "github.com/cgrates/cgrates/engine" "github.com/cgrates/cgrates/utils" ) @@ -36,13 +36,13 @@ func (self *Apier) SetTPActionTriggers(attrs utils.ApiTPActionTriggers, reply *s } else if exists { return errors.New(utils.ERR_DUPLICATE) } - aTriggers := make([]*rater.ActionTrigger, len(attrs.ActionTriggers)) + aTriggers := make([]*engine.ActionTrigger, len(attrs.ActionTriggers)) for idx, at := range attrs.ActionTriggers { requiredFields := []string{"BalanceId", "Direction", "ThresholdType", "ThresholdValue", "ActionsId", "Weight"} if missing := utils.MissingStructFields(&at, requiredFields); len(missing) != 0 { return fmt.Errorf("%s:Balance:%s:%v", utils.ERR_MANDATORY_IE_MISSING, at.BalanceId, missing) } - at := &rater.ActionTrigger{ + at := &engine.ActionTrigger{ BalanceId: at.BalanceId, Direction: at.Direction, ThresholdType: at.ThresholdType, @@ -54,7 +54,7 @@ func (self *Apier) SetTPActionTriggers(attrs utils.ApiTPActionTriggers, reply *s aTriggers[idx] = at } - ats := map[string][]*rater.ActionTrigger{ + ats := map[string][]*engine.ActionTrigger{ attrs.ActionTriggersId: aTriggers} if err := self.StorDb.SetTPActionTriggers(attrs.TPid, ats); err != nil { diff --git a/apier/tpdestinations.go b/apier/tpdestinations.go index 58a02219f..3b3f10e35 100644 --- a/apier/tpdestinations.go +++ b/apier/tpdestinations.go @@ -21,7 +21,7 @@ package apier import ( "errors" "fmt" - "github.com/cgrates/cgrates/rater" + "github.com/cgrates/cgrates/engine" "github.com/cgrates/cgrates/utils" ) @@ -41,7 +41,7 @@ func (self *Apier) SetTPDestination(attrs ApierTPDestination, reply *string) err } else if exists { return errors.New(utils.ERR_DUPLICATE) } - if err := self.StorDb.SetTPDestination(attrs.TPid, &rater.Destination{attrs.DestinationId, attrs.Prefixes}); err != nil { + if err := self.StorDb.SetTPDestination(attrs.TPid, &engine.Destination{attrs.DestinationId, attrs.Prefixes}); err != nil { return fmt.Errorf("%s:%s", utils.ERR_SERVER_ERROR, err.Error()) } *reply = "OK" diff --git a/apier/tptimings.go b/apier/tptimings.go index aa6d93737..626dfc389 100644 --- a/apier/tptimings.go +++ b/apier/tptimings.go @@ -21,7 +21,7 @@ package apier import ( "errors" "fmt" - "github.com/cgrates/cgrates/rater" + "github.com/cgrates/cgrates/engine" "github.com/cgrates/cgrates/utils" ) @@ -45,7 +45,7 @@ func (self *Apier) SetTPTiming(attrs ApierTPTiming, reply *string) error { } else if exists { return errors.New(utils.ERR_DUPLICATE) } - tm := rater.NewTiming(attrs.TimingId, attrs.Years, attrs.Months, attrs.MonthDays, attrs.WeekDays, attrs.Time) + tm := engine.NewTiming(attrs.TimingId, attrs.Years, attrs.Months, attrs.MonthDays, attrs.WeekDays, attrs.Time) if err := self.StorDb.SetTPTiming(attrs.TPid, tm); err != nil { return fmt.Errorf("%s:%s", utils.ERR_SERVER_ERROR, err.Error()) } diff --git a/cdrs/cdrs.go b/cdrs/cdrs.go index a3f7558d6..1d6262c4d 100644 --- a/cdrs/cdrs.go +++ b/cdrs/cdrs.go @@ -22,14 +22,14 @@ import ( "fmt" "github.com/cgrates/cgrates/config" "github.com/cgrates/cgrates/mediator" - "github.com/cgrates/cgrates/rater" + "github.com/cgrates/cgrates/engine" "io/ioutil" "net/http" ) var ( cfg *config.CGRConfig // Share the configuration with the rest of the package - storage rater.DataStorage + storage engine.DataStorage medi *mediator.Mediator ) @@ -40,19 +40,19 @@ func cdrHandler(w http.ResponseWriter, r *http.Request) { if cfg.CDRSMediator == "internal" { errMedi := medi.MediateDBCDR(fsCdr, storage) if errMedi != nil { - rater.Logger.Err(fmt.Sprintf("Could not run mediation on CDR: %s", errMedi.Error())) + engine.Logger.Err(fmt.Sprintf("Could not run mediation on CDR: %s", errMedi.Error())) } } else { //TODO: use the connection to mediator } } else { - rater.Logger.Err(fmt.Sprintf("Could not create CDR entry: %v", err)) + engine.Logger.Err(fmt.Sprintf("Could not create CDR entry: %v", err)) } } type CDRS struct{} -func New(s rater.DataStorage, m *mediator.Mediator, c *config.CGRConfig) *CDRS { +func New(s engine.DataStorage, m *mediator.Mediator, c *config.CGRConfig) *CDRS { storage = s medi = m cfg = c diff --git a/cmd/cgr-engine/cgr-engine.go b/cmd/cgr-engine/cgr-engine.go index b3140e944..02a52c356 100644 --- a/cmd/cgr-engine/cgr-engine.go +++ b/cmd/cgr-engine/cgr-engine.go @@ -26,8 +26,8 @@ import ( "github.com/cgrates/cgrates/balancer2go" "github.com/cgrates/cgrates/cdrs" "github.com/cgrates/cgrates/config" - "github.com/cgrates/cgrates/engine" "github.com/cgrates/cgrates/mediator" + "github.com/cgrates/cgrates/engine" "github.com/cgrates/cgrates/scheduler" "github.com/cgrates/cgrates/sessionmanager" "github.com/cgrates/cgrates/utils" @@ -63,16 +63,16 @@ var ( err error ) -func listenToRPCRequests(rpcResponder interface{}, apier *apier.Apier, rpcAddress string, rpc_encoding string, getter rater.DataStorage, loggerDb rater.DataStorage) { +func listenToRPCRequests(rpcResponder interface{}, apier *apier.Apier, rpcAddress string, rpc_encoding string, getter engine.DataStorage, loggerDb engine.DataStorage) { l, err := net.Listen("tcp", rpcAddress) if err != nil { - rater.Logger.Crit(fmt.Sprintf(" Could not listen to %v: %v", rpcAddress, err)) + engine.Logger.Crit(fmt.Sprintf(" Could not listen to %v: %v", rpcAddress, err)) exitChan <- true return } defer l.Close() - rater.Logger.Info(fmt.Sprintf(" Listening for incomming RPC requests on %v", l.Addr())) + engine.Logger.Info(fmt.Sprintf(" Listening for incomming RPC requests on %v", l.Addr())) rpc.Register(rpcResponder) rpc.Register(apier) var serveFunc func(io.ReadWriteCloser) @@ -84,17 +84,17 @@ func listenToRPCRequests(rpcResponder interface{}, apier *apier.Apier, rpcAddres for { conn, err := l.Accept() if err != nil { - rater.Logger.Err(fmt.Sprintf(" Accept error: %v", conn)) + engine.Logger.Err(fmt.Sprintf(" Accept error: %v", conn)) continue } - rater.Logger.Info(fmt.Sprintf(" New incoming connection: %v", conn.RemoteAddr())) + engine.Logger.Info(fmt.Sprintf(" New incoming connection: %v", conn.RemoteAddr())) go serveFunc(conn) } } -func startMediator(responder *rater.Responder, loggerDb rater.DataStorage) { - var connector rater.Connector +func startMediator(responder *engine.Responder, loggerDb engine.DataStorage) { + var connector engine.Connector if cfg.MediatorRater == INTERNAL { connector = responder } else { @@ -118,15 +118,15 @@ func startMediator(responder *rater.Responder, loggerDb rater.DataStorage) { } } if err != nil { - rater.Logger.Crit(fmt.Sprintf("Could not connect to rater: %v", err)) + engine.Logger.Crit(fmt.Sprintf("Could not connect to engine: %v", err)) exitChan <- true } - connector = &rater.RPCClientConnector{Client: client} + connector = &engine.RPCClientConnector{Client: client} } var err error medi, err = mediator.NewMediator(connector, loggerDb, cfg) if err != nil { - rater.Logger.Crit(fmt.Sprintf("Mediator config parsing error: %v", err)) + engine.Logger.Crit(fmt.Sprintf("Mediator config parsing error: %v", err)) exitChan <- true } @@ -135,8 +135,8 @@ func startMediator(responder *rater.Responder, loggerDb rater.DataStorage) { } } -func startSessionManager(responder *rater.Responder, loggerDb rater.DataStorage) { - var connector rater.Connector +func startSessionManager(responder *engine.Responder, loggerDb engine.DataStorage) { + var connector engine.Connector if cfg.SMRater == INTERNAL { connector = responder } else { @@ -162,10 +162,10 @@ func startSessionManager(responder *rater.Responder, loggerDb rater.DataStorage) } if err != nil { - rater.Logger.Crit(fmt.Sprintf("Could not connect to rater: %v", err)) + engine.Logger.Crit(fmt.Sprintf("Could not connect to engine: %v", err)) exitChan <- true } - connector = &rater.RPCClientConnector{Client: client} + connector = &engine.RPCClientConnector{Client: client} } switch cfg.SMSwitchType { case FS: @@ -173,16 +173,16 @@ func startSessionManager(responder *rater.Responder, loggerDb rater.DataStorage) sm = sessionmanager.NewFSSessionManager(loggerDb, connector, dp) errConn := sm.Connect(cfg) if errConn != nil { - rater.Logger.Err(fmt.Sprintf(" error: %s!", errConn)) + engine.Logger.Err(fmt.Sprintf(" error: %s!", errConn)) } default: - rater.Logger.Err(fmt.Sprintf(" Unsupported session manger type: %s!", cfg.SMSwitchType)) + engine.Logger.Err(fmt.Sprintf(" Unsupported session manger type: %s!", cfg.SMSwitchType)) exitChan <- true } exitChan <- true } -func startCDRS(responder *rater.Responder, loggerDb rater.DataStorage) { +func startCDRS(responder *engine.Responder, loggerDb engine.DataStorage) { if cfg.CDRSMediator == INTERNAL { for i := 0; i < 3; i++ { // ToDo: If the right approach, make the reconnects configurable time.Sleep(time.Duration(i/2) * time.Second) @@ -191,7 +191,7 @@ func startCDRS(responder *rater.Responder, loggerDb rater.DataStorage) { } } if medi == nil { - rater.Logger.Crit(" Could not connect to mediator, exiting.") + engine.Logger.Crit(" Could not connect to mediator, exiting.") exitChan <- true } } @@ -202,11 +202,11 @@ func startCDRS(responder *rater.Responder, loggerDb rater.DataStorage) { func checkConfigSanity() error { if cfg.SMEnabled && cfg.RaterEnabled && cfg.RaterBalancer != DISABLED { - rater.Logger.Crit("The session manager must not be enabled on a worker rater (change [rater]/balancer to disabled)!") + engine.Logger.Crit("The session manager must not be enabled on a worker engine (change [engine]/balancer to disabled)!") return errors.New("SessionManager on Worker") } if cfg.BalancerEnabled && cfg.RaterEnabled && cfg.RaterBalancer != DISABLED { - rater.Logger.Crit("The balancer is enabled so it cannot connect to anatoher balancer (change [rater]/balancer to disabled)!") + engine.Logger.Crit("The balancer is enabled so it cannot connect to anatoher balancer (change [engine]/balancer to disabled)!") return errors.New("Improperly configured balancer") } @@ -223,39 +223,39 @@ func main() { cfg, err = config.NewCGRConfig(cfgPath) if err != nil { - rater.Logger.Crit(fmt.Sprintf("Could not parse config: %s exiting!", err)) + engine.Logger.Crit(fmt.Sprintf("Could not parse config: %s exiting!", err)) return } // some consitency checks errCfg := checkConfigSanity() if errCfg != nil { - rater.Logger.Crit(errCfg.Error()) + engine.Logger.Crit(errCfg.Error()) return } - var getter, loggerDb rater.DataStorage - getter, err = rater.ConfigureDatabase(cfg.DataDBType, cfg.DataDBHost, cfg.DataDBPort, cfg.DataDBName, cfg.DataDBUser, cfg.DataDBPass) + var getter, loggerDb engine.DataStorage + getter, err = engine.ConfigureDatabase(cfg.DataDBType, cfg.DataDBHost, cfg.DataDBPort, cfg.DataDBName, cfg.DataDBUser, cfg.DataDBPass) if err != nil { // Cannot configure getter database, show stopper - rater.Logger.Crit(fmt.Sprintf("Could not configure dataDb: %s exiting!", err)) + engine.Logger.Crit(fmt.Sprintf("Could not configure dataDb: %s exiting!", err)) return } defer getter.Close() - rater.SetDataStorage(getter) + engine.SetDataStorage(getter) if cfg.StorDBType == SAME { loggerDb = getter } else { - loggerDb, err = rater.ConfigureDatabase(cfg.StorDBType, cfg.StorDBHost, cfg.StorDBPort, cfg.StorDBName, cfg.StorDBUser, cfg.StorDBPass) + loggerDb, err = engine.ConfigureDatabase(cfg.StorDBType, cfg.StorDBHost, cfg.StorDBPort, cfg.StorDBName, cfg.StorDBUser, cfg.StorDBPass) if err != nil { // Cannot configure logger database, show stopper - rater.Logger.Crit(fmt.Sprintf("Could not configure logger database: %s exiting!", err)) + engine.Logger.Crit(fmt.Sprintf("Could not configure logger database: %s exiting!", err)) return } } defer loggerDb.Close() - rater.SetStorageLogger(loggerDb) + engine.SetStorageLogger(loggerDb) if cfg.SMDebitInterval > 0 { if dp, err := time.ParseDuration(fmt.Sprintf("%vs", cfg.SMDebitInterval)); err == nil { - rater.SetDebitPeriod(dp) + engine.SetDebitPeriod(dp) } } @@ -264,25 +264,25 @@ func main() { go registerToBalancer() go stopRaterSingnalHandler() } - responder := &rater.Responder{ExitChan: exitChan} + responder := &engine.Responder{ExitChan: exitChan} apier := &apier.Apier{StorDb: loggerDb, DataDb: getter} if cfg.RaterEnabled && !cfg.BalancerEnabled && cfg.RaterListen != INTERNAL { - rater.Logger.Info(fmt.Sprintf("Starting CGRateS Rater on %s.", cfg.RaterListen)) + engine.Logger.Info(fmt.Sprintf("Starting CGRateS Rater on %s.", cfg.RaterListen)) go listenToRPCRequests(responder, apier, cfg.RaterListen, cfg.RPCEncoding, getter, loggerDb) } if cfg.BalancerEnabled { - rater.Logger.Info(fmt.Sprintf("Starting CGRateS Balancer on %s.", cfg.BalancerListen)) + engine.Logger.Info(fmt.Sprintf("Starting CGRateS Balancer on %s.", cfg.BalancerListen)) go stopBalancerSingnalHandler() responder.Bal = bal go listenToRPCRequests(responder, apier, cfg.BalancerListen, cfg.RPCEncoding, getter, loggerDb) if cfg.RaterEnabled { - rater.Logger.Info("Starting internal rater.") - bal.AddClient("local", new(rater.ResponderWorker)) + engine.Logger.Info("Starting internal engine.") + bal.AddClient("local", new(engine.ResponderWorker)) } } if cfg.SchedulerEnabled { - rater.Logger.Info("Starting CGRateS Scheduler.") + engine.Logger.Info("Starting CGRateS Scheduler.") go func() { sched := scheduler.NewScheduler() go reloadSchedulerSingnalHandler(sched, getter) @@ -293,21 +293,21 @@ func main() { } if cfg.SMEnabled { - rater.Logger.Info("Starting CGRateS SessionManager.") + engine.Logger.Info("Starting CGRateS SessionManager.") go startSessionManager(responder, loggerDb) // close all sessions on shutdown go shutdownSessionmanagerSingnalHandler() } if cfg.MediatorEnabled { - rater.Logger.Info("Starting CGRateS Mediator.") + engine.Logger.Info("Starting CGRateS Mediator.") go startMediator(responder, loggerDb) } if cfg.CDRSListen != "" { - rater.Logger.Info("Starting CGRateS CDR Server.") + engine.Logger.Info("Starting CGRateS CDR Server.") go startCDRS(responder, loggerDb) } <-exitChan - rater.Logger.Info("Stopped all components. CGRateS shutdown!") + engine.Logger.Info("Stopped all components. CGRateS shutdown!") } diff --git a/cmd/cgr-engine/registration.go b/cmd/cgr-engine/registration.go index 137a2f7ae..03f8a484c 100644 --- a/cmd/cgr-engine/registration.go +++ b/cmd/cgr-engine/registration.go @@ -29,14 +29,14 @@ import ( ) /* -Listens for SIGTERM, SIGINT, SIGQUIT system signals and shuts down all the registered raters. +Listens for SIGTERM, SIGINT, SIGQUIT system signals and shuts down all the registered engines. */ func stopBalancerSingnalHandler() { c := make(chan os.Signal) signal.Notify(c, syscall.SIGTERM, syscall.SIGINT, syscall.SIGQUIT) sig := <-c - rater.Logger.Info(fmt.Sprintf("Caught signal %v, sending shutdownto raters\n", sig)) + engine.Logger.Info(fmt.Sprintf("Caught signal %v, sending shutdownto engines\n", sig)) bal.Shutdown("Responder.Shutdown") exitChan <- true } @@ -49,7 +49,7 @@ func stopRaterSingnalHandler() { signal.Notify(c, syscall.SIGTERM, syscall.SIGINT, syscall.SIGQUIT) sig := <-c - rater.Logger.Info(fmt.Sprintf("Caught signal %v, unregistering from balancer\n", sig)) + engine.Logger.Info(fmt.Sprintf("Caught signal %v, unregistering from balancer\n", sig)) unregisterFromBalancer() exitChan <- true } @@ -60,47 +60,47 @@ Connects to the balancer and calls unregister RPC method. func unregisterFromBalancer() { client, err := rpc.Dial("tcp", cfg.RaterBalancer) if err != nil { - rater.Logger.Crit("Cannot contact the balancer!") + engine.Logger.Crit("Cannot contact the balancer!") exitChan <- true return } var reply int - rater.Logger.Info(fmt.Sprintf("Unregistering from balancer %s", cfg.RaterBalancer)) + engine.Logger.Info(fmt.Sprintf("Unregistering from balancer %s", cfg.RaterBalancer)) client.Call("Responder.UnRegisterRater", cfg.RaterListen, &reply) if err := client.Close(); err != nil { - rater.Logger.Crit("Could not close balancer unregistration!") + engine.Logger.Crit("Could not close balancer unregistration!") exitChan <- true } } /* -Connects to the balancer and rehisters the rater to the server. +Connects to the balancer and rehisters the engine to the server. */ func registerToBalancer() { client, err := rpc.Dial("tcp", cfg.RaterBalancer) if err != nil { - rater.Logger.Crit(fmt.Sprintf("Cannot contact the balancer: %v", err)) + engine.Logger.Crit(fmt.Sprintf("Cannot contact the balancer: %v", err)) exitChan <- true return } var reply int - rater.Logger.Info(fmt.Sprintf("Registering to balancer %s", cfg.RaterBalancer)) + engine.Logger.Info(fmt.Sprintf("Registering to balancer %s", cfg.RaterBalancer)) client.Call("Responder.RegisterRater", cfg.RaterListen, &reply) if err := client.Close(); err != nil { - rater.Logger.Crit("Could not close balancer registration!") + engine.Logger.Crit("Could not close balancer registration!") exitChan <- true } - rater.Logger.Info("Registration finished!") + engine.Logger.Info("Registration finished!") } // Listens for the HUP system signal and gracefuly reloads the timers from database. -func reloadSchedulerSingnalHandler(sched *scheduler.Scheduler, getter rater.DataStorage) { +func reloadSchedulerSingnalHandler(sched *scheduler.Scheduler, getter engine.DataStorage) { for { c := make(chan os.Signal) signal.Notify(c, syscall.SIGHUP) sig := <-c - rater.Logger.Info(fmt.Sprintf("Caught signal %v, reloading action timings.\n", sig)) + engine.Logger.Info(fmt.Sprintf("Caught signal %v, reloading action timings.\n", sig)) sched.LoadActionTimings(getter) // check the tip of the queue for new actions sched.Restart() @@ -116,7 +116,7 @@ func shutdownSessionmanagerSingnalHandler() { <-c if err := sm.Shutdown(); err != nil { - rater.Logger.Warning(fmt.Sprintf(" %s", err)) + engine.Logger.Warning(fmt.Sprintf(" %s", err)) } exitChan <- true } diff --git a/cmd/cgr-loader/cgr-loader.go b/cmd/cgr-loader/cgr-loader.go index 7a8527e8f..fff828964 100644 --- a/cmd/cgr-loader/cgr-loader.go +++ b/cmd/cgr-loader/cgr-loader.go @@ -21,7 +21,7 @@ package main import ( "flag" "fmt" - "github.com/cgrates/cgrates/rater" + "github.com/cgrates/cgrates/engine" "github.com/cgrates/cgrates/utils" "github.com/cgrates/cgrates/config" "log" @@ -69,15 +69,15 @@ func main() { return } var errDataDb, errStorDb, err error - var dataDb, storDb rater.DataStorage + var dataDb, storDb engine.DataStorage // Init necessary db connections if *fromStorDb { - dataDb, errDataDb = rater.ConfigureDatabase(*stor_db_type, *stor_db_host, *stor_db_port, *stor_db_name, *stor_db_user, *stor_db_pass) - storDb, errStorDb = rater.ConfigureDatabase(*data_db_type, *data_db_host, *data_db_port, *data_db_name, *data_db_user, *data_db_pass) + dataDb, errDataDb = engine.ConfigureDatabase(*stor_db_type, *stor_db_host, *stor_db_port, *stor_db_name, *stor_db_user, *stor_db_pass) + storDb, errStorDb = engine.ConfigureDatabase(*data_db_type, *data_db_host, *data_db_port, *data_db_name, *data_db_user, *data_db_pass) } else if *toStorDb { // Import from csv files to storDb - storDb, errStorDb = rater.ConfigureDatabase(*data_db_type, *data_db_host, *data_db_port, *data_db_name, *data_db_user, *data_db_pass) + storDb, errStorDb = engine.ConfigureDatabase(*data_db_type, *data_db_host, *data_db_port, *data_db_name, *data_db_user, *data_db_pass) } else { // Default load from csv files to dataDb - dataDb, errDataDb = rater.ConfigureDatabase(*stor_db_type, *stor_db_host, *stor_db_port, *stor_db_name, *stor_db_user, *stor_db_pass) + dataDb, errDataDb = engine.ConfigureDatabase(*stor_db_type, *stor_db_host, *stor_db_port, *stor_db_name, *stor_db_user, *stor_db_pass) } defer dataDb.Close() defer storDb.Close() @@ -87,9 +87,9 @@ func main() { } } - var loader rater.TPLoader + var loader engine.TPLoader if *fromStorDb { - loader = rater.NewDbReader(storDb, dataDb, *tpid) + loader = engine.NewDbReader(storDb, dataDb, *tpid) } else { // Default load from csv files to dataDb dataFilesValidators := []*validator{ &validator{utils.DESTINATIONS_CSV, @@ -124,13 +124,13 @@ func main() { "Tenant[0-9A-Za-z_],Account[0-9A-Za-z_:.],Direction OUT|IN,ActionTimingsTag[0-9A-Za-z_],ActionTriggersTag[0-9A-Za-z_]"}, } for _, v := range dataFilesValidators { - err := rater.ValidateCSVData(path.Join(*dataPath, v.fn), v.re) + err := engine.ValidateCSVData(path.Join(*dataPath, v.fn), v.re) if err != nil { log.Fatal(err, "\n\t", v.message) } } //sep = []rune(*separator)[0] - loader = rater.NewFileCSVReader(dataDb, ',', utils.DESTINATIONS_CSV, utils.TIMINGS_CSV, utils.RATES_CSV, utils.DESTINATION_RATES_CSV, utils.DESTRATE_TIMINGS_CSV, utils.RATE_PROFILES_CSV, utils.ACTIONS_CSV, utils.ACTION_TIMINGS_CSV, utils.ACTION_TRIGGERS_CSV, utils.ACCOUNT_ACTIONS_CSV) + loader = engine.NewFileCSVReader(dataDb, ',', utils.DESTINATIONS_CSV, utils.TIMINGS_CSV, utils.RATES_CSV, utils.DESTINATION_RATES_CSV, utils.DESTRATE_TIMINGS_CSV, utils.RATE_PROFILES_CSV, utils.ACTIONS_CSV, utils.ACTION_TIMINGS_CSV, utils.ACTION_TRIGGERS_CSV, utils.ACCOUNT_ACTIONS_CSV) } err = loader.LoadDestinations() diff --git a/cmd/stress/cgr-raterstress/cgr-raterstress.go b/cmd/stress/cgr-raterstress/cgr-raterstress.go index 959ba7c8b..465c5c7de 100644 --- a/cmd/stress/cgr-raterstress/cgr-raterstress.go +++ b/cmd/stress/cgr-raterstress/cgr-raterstress.go @@ -20,7 +20,7 @@ package main import ( "flag" - "github.com/cgrates/cgrates/rater" + "github.com/cgrates/cgrates/engine" "log" "net/rpc" //"net/rpc/jsonrpc" @@ -42,8 +42,8 @@ func main() { t1 := time.Date(2012, time.February, 02, 17, 30, 0, 0, time.UTC) t2 := time.Date(2012, time.February, 02, 18, 30, 0, 0, time.UTC) - cd := rater.CallDescriptor{Direction: "OUT", TOR: "0", Tenant: "vdf", Subject: "rif", Destination: "0256", TimeStart: t1, TimeEnd: t2} - result := rater.CallCost{} + cd := engine.CallDescriptor{Direction: "OUT", TOR: "0", Tenant: "vdf", Subject: "rif", Destination: "0256", TimeStart: t1, TimeEnd: t2} + result := engine.CallCost{} var client *rpc.Client var err error if *json { @@ -52,7 +52,7 @@ func main() { client, err = rpc.Dial("tcp", *balancer) } if err != nil { - log.Fatal("Could not connect to rater: ", err) + log.Fatal("Could not connect to engine: ", err) } start := time.Now() if *parallel > 0 { diff --git a/cmd/stress/cgr-spansstress/cgr-spansstress.go b/cmd/stress/cgr-spansstress/cgr-spansstress.go index 89feef2b9..dbc43e4c1 100644 --- a/cmd/stress/cgr-spansstress/cgr-spansstress.go +++ b/cmd/stress/cgr-spansstress/cgr-spansstress.go @@ -20,7 +20,7 @@ package main import ( "flag" - "github.com/cgrates/cgrates/rater" + "github.com/cgrates/cgrates/engine" "log" "os" "runtime" @@ -57,16 +57,16 @@ func main() { } t1 := time.Date(2012, time.February, 02, 17, 30, 0, 0, time.UTC) t2 := time.Date(2012, time.February, 02, 18, 30, 0, 0, time.UTC) - cd := rater.CallDescriptor{Direction: "OUT", TOR: "0", Tenant: "vdf", Subject: "rif", Destination: "0256", TimeStart: t1, TimeEnd: t2} + cd := engine.CallDescriptor{Direction: "OUT", TOR: "0", Tenant: "vdf", Subject: "rif", Destination: "0256", TimeStart: t1, TimeEnd: t2} - getter, err := rater.NewRedisStorage("localhost:6379", 10, "") - //getter, err := rater.NewMongoStorage("localhost", "cgrates") + getter, err := engine.NewRedisStorage("localhost:6379", 10, "") + //getter, err := engine.NewMongoStorage("localhost", "cgrates") defer getter.Close() - rater.SetDataStorage(getter) + engine.SetDataStorage(getter) log.Printf("Runnning %d cycles...", *runs) - var result *rater.CallCost + var result *engine.CallCost j := 0 start := time.Now() for i := 0; i < *runs; i++ { diff --git a/console/balance.go b/console/balance.go index b84885da6..4930fb41b 100644 --- a/console/balance.go +++ b/console/balance.go @@ -4,7 +4,7 @@ package console import ( "fmt" - "github.com/cgrates/cgrates/rater" + "github.com/cgrates/cgrates/engine" ) func init() { @@ -14,8 +14,8 @@ func init() { // Commander implementation type CmdGetBalance struct { rpcMethod string - rpcParams *rater.CallDescriptor - rpcResult *rater.CallCost + rpcParams *engine.CallDescriptor + rpcResult *engine.CallCost } // name should be exec's name @@ -26,7 +26,7 @@ func (self *CmdGetBalance) Usage(name string) string { // set param defaults func (self *CmdGetBalance) defaults() error { self.rpcMethod = "Responder.GetMonetary" - self.rpcParams = &rater.CallDescriptor{Direction: "OUT"} + self.rpcParams = &engine.CallDescriptor{Direction: "OUT"} return nil } @@ -68,6 +68,6 @@ func (self *CmdGetBalance) RpcParams() interface{} { } func (self *CmdGetBalance) RpcResult() interface{} { - self.rpcResult = &rater.CallCost{} + self.rpcResult = &engine.CallCost{} return self.rpcResult } diff --git a/docs/architecture.rst b/docs/architecture.rst index 6f9c3d3c8..4ad584b4c 100644 --- a/docs/architecture.rst +++ b/docs/architecture.rst @@ -3,7 +3,7 @@ The CGRateS suite consits of three software applications, described bellow. -2.1. cgr-rater +2.1. cgr-engine -------------- The most important and complex as functionality. @@ -11,12 +11,12 @@ Customisable through the use of a configuration file, it will start on demand on :: - rif@grace:~$ cgr-rater -help - Usage of cgr-rater: + rif@grace:~$ cgr-engine -help + Usage of cgr-engine: -config="/etc/cgrates/cgrates.cfg": Configuration file location. -version=false: Prints the application version. -:Example: cgr-rater -config=cgr-customconfig.cfg +:Example: cgr-engine -config=cgr-customconfig.cfg 2.1.1. Rater service ~~~~~~~~~~~~~~~~~~~~ @@ -26,7 +26,7 @@ Responsible with the following tasks: - Computes prices for rating subjects. - Monitors and executes triggers. -Accessed by components using it's functionality via RPC or directly within same running cgr-rater process. +Accessed by components using it's functionality via RPC or directly within same running cgr-engine process. 2.1.2. Balancer service ~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/docs/configuration.rst b/docs/configuration.rst index 95d4e1d9c..174d74662 100644 --- a/docs/configuration.rst +++ b/docs/configuration.rst @@ -2,11 +2,11 @@ ================ -4.1. cgr-rater configuration file +4.1. cgr-engine configuration file --------------------------------- Organized into configuration sections. All configuration options come with defaults and we have tried our best to choose the best ones for a minimum of efforts necessary when running. -Bellow is the default configuration file which comes hardcoded into cgr-rater. +Bellow is the default configuration file which comes hardcoded into cgr-engine. :: diff --git a/docs/freeswitch.rst b/docs/freeswitch.rst index 1d70576a8..f21999d58 100644 --- a/docs/freeswitch.rst +++ b/docs/freeswitch.rst @@ -72,7 +72,7 @@ A typical usage into our implementations is a combination between the two modes 8.1.2.2. Implementation logic ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -- The Mediator process is configured and started in the *cgrates.cfg* file and is alive as long as the *cgr-rater* application is on. +- The Mediator process is configured and started in the *cgrates.cfg* file and is alive as long as the *cgr-engine* application is on. - To avoid concurrency issues, the Mediator does not process active maintained CDR csv files by FreeSWITCH_ but picks them up as soon as FreeSWITCH_ has done with them by rotating. The information about rotation comes in real-time on the Linux OS through the use of inotify. - Based on configured indexes in the configuration file, the Mediator will start multiple processes for the same CDR. - For each mediation process configured the Mediator will apped the original CDR with costs calculated. In case of errors of some kind, the value *-1* will be prepended. diff --git a/rater/accountlock.go b/engine/accountlock.go similarity index 99% rename from rater/accountlock.go rename to engine/accountlock.go index 21759ec9b..a781447ed 100644 --- a/rater/accountlock.go +++ b/engine/accountlock.go @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see */ -package rater +package engine import ( "sync" diff --git a/rater/accountlock_test.go b/engine/accountlock_test.go similarity index 98% rename from rater/accountlock_test.go rename to engine/accountlock_test.go index d9372837c..ae1e22d07 100644 --- a/rater/accountlock_test.go +++ b/engine/accountlock_test.go @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see */ -package rater +package engine import ( "log" diff --git a/rater/action.go b/engine/action.go similarity index 99% rename from rater/action.go rename to engine/action.go index 99a7c9964..7dd7c3f80 100644 --- a/rater/action.go +++ b/engine/action.go @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see */ -package rater +package engine import ( "fmt" diff --git a/rater/action_timing.go b/engine/action_timing.go similarity index 99% rename from rater/action_timing.go rename to engine/action_timing.go index c98774c6e..87b0d6cbb 100644 --- a/rater/action_timing.go +++ b/engine/action_timing.go @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see */ -package rater +package engine import ( "fmt" diff --git a/rater/action_trigger.go b/engine/action_trigger.go similarity index 99% rename from rater/action_trigger.go rename to engine/action_trigger.go index 6939682fe..d88b40ad2 100644 --- a/rater/action_trigger.go +++ b/engine/action_trigger.go @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see */ -package rater +package engine import ( "fmt" diff --git a/rater/actions_test.go b/engine/actions_test.go similarity index 99% rename from rater/actions_test.go rename to engine/actions_test.go index d31f92143..6599a9482 100644 --- a/rater/actions_test.go +++ b/engine/actions_test.go @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see */ -package rater +package engine import ( "github.com/cgrates/cgrates/utils" diff --git a/rater/activationperiod.go b/engine/activationperiod.go similarity index 99% rename from rater/activationperiod.go rename to engine/activationperiod.go index 9d4b1b93f..deed2c518 100644 --- a/rater/activationperiod.go +++ b/engine/activationperiod.go @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see */ -package rater +package engine import ( "github.com/cgrates/cgrates/cache2go" diff --git a/rater/activationperiod_test.go b/engine/activationperiod_test.go similarity index 99% rename from rater/activationperiod_test.go rename to engine/activationperiod_test.go index ff578b998..e1fe81b21 100644 --- a/rater/activationperiod_test.go +++ b/engine/activationperiod_test.go @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see */ -package rater +package engine import ( "encoding/json" diff --git a/rater/callcost.go b/engine/callcost.go similarity index 99% rename from rater/callcost.go rename to engine/callcost.go index 087e8e2bc..71561c718 100644 --- a/rater/callcost.go +++ b/engine/callcost.go @@ -15,7 +15,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see */ -package rater +package engine import ( "fmt" diff --git a/rater/callcost_test.go b/engine/callcost_test.go similarity index 99% rename from rater/callcost_test.go rename to engine/callcost_test.go index 57d37b14f..2aeb77415 100644 --- a/rater/callcost_test.go +++ b/engine/callcost_test.go @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see */ -package rater +package engine import ( // "log" diff --git a/rater/calldesc.go b/engine/calldesc.go similarity index 99% rename from rater/calldesc.go rename to engine/calldesc.go index 5e1f9e228..1cdbe480c 100644 --- a/rater/calldesc.go +++ b/engine/calldesc.go @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see */ -package rater +package engine import ( "errors" diff --git a/rater/calldesc_test.go b/engine/calldesc_test.go similarity index 99% rename from rater/calldesc_test.go rename to engine/calldesc_test.go index 41e73cdf2..eaee91d67 100644 --- a/rater/calldesc_test.go +++ b/engine/calldesc_test.go @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see */ -package rater +package engine import ( "log" diff --git a/rater/dateseries.go b/engine/dateseries.go similarity index 99% rename from rater/dateseries.go rename to engine/dateseries.go index 090857def..d3fc53d6c 100644 --- a/rater/dateseries.go +++ b/engine/dateseries.go @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see */ -package rater +package engine import ( "fmt" diff --git a/rater/dateseries_test.go b/engine/dateseries_test.go similarity index 99% rename from rater/dateseries_test.go rename to engine/dateseries_test.go index 0325286b3..6e8f95ddd 100644 --- a/rater/dateseries_test.go +++ b/engine/dateseries_test.go @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see */ -package rater +package engine import ( "encoding/json" diff --git a/rater/destinations.go b/engine/destinations.go similarity index 99% rename from rater/destinations.go rename to engine/destinations.go index aa61a69f5..0d15f592e 100644 --- a/rater/destinations.go +++ b/engine/destinations.go @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see */ -package rater +package engine import ( "github.com/cgrates/cgrates/cache2go" diff --git a/rater/destinations_test.go b/engine/destinations_test.go similarity index 99% rename from rater/destinations_test.go rename to engine/destinations_test.go index 0dc86b950..352f6fda4 100644 --- a/rater/destinations_test.go +++ b/engine/destinations_test.go @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see */ -package rater +package engine import ( "encoding/json" diff --git a/rater/interval.go b/engine/interval.go similarity index 99% rename from rater/interval.go rename to engine/interval.go index b775521fd..adfbe99fd 100644 --- a/rater/interval.go +++ b/engine/interval.go @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with thresult program. If not, see */ -package rater +package engine import ( "fmt" diff --git a/rater/interval_test.go b/engine/interval_test.go similarity index 99% rename from rater/interval_test.go rename to engine/interval_test.go index 58c71b193..ec8da2893 100644 --- a/rater/interval_test.go +++ b/engine/interval_test.go @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see */ -package rater +package engine import ( "testing" diff --git a/rater/loader_csv.go b/engine/loader_csv.go similarity index 99% rename from rater/loader_csv.go rename to engine/loader_csv.go index aaf76e9a3..0ef392239 100644 --- a/rater/loader_csv.go +++ b/engine/loader_csv.go @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see */ -package rater +package engine import ( "encoding/csv" diff --git a/rater/loader_csv_test.go b/engine/loader_csv_test.go similarity index 99% rename from rater/loader_csv_test.go rename to engine/loader_csv_test.go index c9abb2984..b9a4ea399 100644 --- a/rater/loader_csv_test.go +++ b/engine/loader_csv_test.go @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see */ -package rater +package engine import ( //"log" diff --git a/rater/loader_db.go b/engine/loader_db.go similarity index 99% rename from rater/loader_db.go rename to engine/loader_db.go index 4cb7e3684..90213e278 100644 --- a/rater/loader_db.go +++ b/engine/loader_db.go @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see */ -package rater +package engine import ( "errors" diff --git a/rater/loader_helpers.go b/engine/loader_helpers.go similarity index 99% rename from rater/loader_helpers.go rename to engine/loader_helpers.go index 13281794f..5ee6bb3ee 100644 --- a/rater/loader_helpers.go +++ b/engine/loader_helpers.go @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see */ -package rater +package engine import ( "bufio" diff --git a/rater/minute_buckets.go b/engine/minute_buckets.go similarity index 99% rename from rater/minute_buckets.go rename to engine/minute_buckets.go index 343133564..fd3104b72 100644 --- a/rater/minute_buckets.go +++ b/engine/minute_buckets.go @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see */ -package rater +package engine import ( "math" diff --git a/rater/minute_buckets_test.go b/engine/minute_buckets_test.go similarity index 99% rename from rater/minute_buckets_test.go rename to engine/minute_buckets_test.go index 128426d2f..55bc2f44f 100644 --- a/rater/minute_buckets_test.go +++ b/engine/minute_buckets_test.go @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see */ -package rater +package engine import ( "reflect" diff --git a/rater/ratingprofile.go b/engine/ratingprofile.go similarity index 99% rename from rater/ratingprofile.go rename to engine/ratingprofile.go index 70a88cfdc..969d29349 100644 --- a/rater/ratingprofile.go +++ b/engine/ratingprofile.go @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see */ -package rater +package engine import ( "errors" diff --git a/rater/ratingprofile_test.go b/engine/ratingprofile_test.go similarity index 99% rename from rater/ratingprofile_test.go rename to engine/ratingprofile_test.go index 8daacf6ec..76e0f78e3 100644 --- a/rater/ratingprofile_test.go +++ b/engine/ratingprofile_test.go @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see */ -package rater +package engine import ( "testing" diff --git a/rater/responder.go b/engine/responder.go similarity index 99% rename from rater/responder.go rename to engine/responder.go index d41446626..70903b0dc 100644 --- a/rater/responder.go +++ b/engine/responder.go @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see */ -package rater +package engine import ( "errors" diff --git a/rater/simple_serializer.go b/engine/simple_serializer.go similarity index 99% rename from rater/simple_serializer.go rename to engine/simple_serializer.go index cbf9be889..3c811dd2c 100644 --- a/rater/simple_serializer.go +++ b/engine/simple_serializer.go @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see */ -package rater +package engine import ( "errors" diff --git a/rater/simple_serializer_test.go b/engine/simple_serializer_test.go similarity index 99% rename from rater/simple_serializer_test.go rename to engine/simple_serializer_test.go index a3726e086..8d393343b 100644 --- a/rater/simple_serializer_test.go +++ b/engine/simple_serializer_test.go @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see */ -package rater +package engine import ( "reflect" diff --git a/rater/storage_interface.go b/engine/storage_interface.go similarity index 99% rename from rater/storage_interface.go rename to engine/storage_interface.go index 263e4a9e8..cd9b4f963 100644 --- a/rater/storage_interface.go +++ b/engine/storage_interface.go @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see */ -package rater +package engine import ( "bytes" diff --git a/rater/storage_map.go b/engine/storage_map.go similarity index 99% rename from rater/storage_map.go rename to engine/storage_map.go index 0e1d57363..f6aaeb4a4 100644 --- a/rater/storage_map.go +++ b/engine/storage_map.go @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see */ -package rater +package engine import ( "errors" diff --git a/rater/storage_mongo.go b/engine/storage_mongo.go similarity index 99% rename from rater/storage_mongo.go rename to engine/storage_mongo.go index 4ad2e752e..2ecff5575 100644 --- a/rater/storage_mongo.go +++ b/engine/storage_mongo.go @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see */ -package rater +package engine import ( "errors" diff --git a/rater/storage_mysql.go b/engine/storage_mysql.go similarity index 98% rename from rater/storage_mysql.go rename to engine/storage_mysql.go index af92432df..c9792d638 100644 --- a/rater/storage_mysql.go +++ b/engine/storage_mysql.go @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see */ -package rater +package engine import ( "database/sql" diff --git a/rater/storage_postgres.go b/engine/storage_postgres.go similarity index 98% rename from rater/storage_postgres.go rename to engine/storage_postgres.go index f495cf43d..3ad3076b8 100644 --- a/rater/storage_postgres.go +++ b/engine/storage_postgres.go @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see */ -package rater +package engine import ( "database/sql" diff --git a/rater/storage_redis.go b/engine/storage_redis.go similarity index 99% rename from rater/storage_redis.go rename to engine/storage_redis.go index ec1b22e4d..cc539f419 100644 --- a/rater/storage_redis.go +++ b/engine/storage_redis.go @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see */ -package rater +package engine import ( "errors" diff --git a/rater/storage_sql.go b/engine/storage_sql.go similarity index 99% rename from rater/storage_sql.go rename to engine/storage_sql.go index dc261cb08..3242b7c35 100644 --- a/rater/storage_sql.go +++ b/engine/storage_sql.go @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see */ -package rater +package engine import ( "database/sql" diff --git a/rater/storage_utils.go b/engine/storage_utils.go similarity index 99% rename from rater/storage_utils.go rename to engine/storage_utils.go index 83d01d7b4..7dc1ad7b3 100644 --- a/rater/storage_utils.go +++ b/engine/storage_utils.go @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see */ -package rater +package engine import ( "strconv" diff --git a/rater/timespans.go b/engine/timespans.go similarity index 99% rename from rater/timespans.go rename to engine/timespans.go index 2abf9097d..aaef756be 100644 --- a/rater/timespans.go +++ b/engine/timespans.go @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see */ -package rater +package engine import ( "fmt" diff --git a/rater/timespans_test.go b/engine/timespans_test.go similarity index 99% rename from rater/timespans_test.go rename to engine/timespans_test.go index 850199d44..801eb4d9d 100644 --- a/rater/timespans_test.go +++ b/engine/timespans_test.go @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see */ -package rater +package engine import ( "testing" diff --git a/rater/tpimporter_csv.go b/engine/tpimporter_csv.go similarity index 98% rename from rater/tpimporter_csv.go rename to engine/tpimporter_csv.go index bb3a6fb1b..b57d49489 100644 --- a/rater/tpimporter_csv.go +++ b/engine/tpimporter_csv.go @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see */ -package rater +package engine // Import tariff plan from csv into storDb diff --git a/rater/units_counter.go b/engine/units_counter.go similarity index 99% rename from rater/units_counter.go rename to engine/units_counter.go index ae59202bf..2f129e567 100644 --- a/rater/units_counter.go +++ b/engine/units_counter.go @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see */ -package rater +package engine import ( "fmt" diff --git a/rater/units_counter_test.go b/engine/units_counter_test.go similarity index 99% rename from rater/units_counter_test.go rename to engine/units_counter_test.go index a2198d953..b118d0bbb 100644 --- a/rater/units_counter_test.go +++ b/engine/units_counter_test.go @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see */ -package rater +package engine import ( "reflect" diff --git a/rater/userbalance.go b/engine/userbalance.go similarity index 99% rename from rater/userbalance.go rename to engine/userbalance.go index 69464ee31..42f2a49ca 100644 --- a/rater/userbalance.go +++ b/engine/userbalance.go @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see */ -package rater +package engine import ( "errors" diff --git a/rater/userbalance_test.go b/engine/userbalance_test.go similarity index 99% rename from rater/userbalance_test.go rename to engine/userbalance_test.go index 00297c465..8047df688 100644 --- a/rater/userbalance_test.go +++ b/engine/userbalance_test.go @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see */ -package rater +package engine import ( //"log" diff --git a/mediator/mediator.go b/mediator/mediator.go index ff7fc7a73..8c4e7a502 100644 --- a/mediator/mediator.go +++ b/mediator/mediator.go @@ -25,7 +25,7 @@ import ( "flag" "fmt" "github.com/cgrates/cgrates/config" - "github.com/cgrates/cgrates/rater" + "github.com/cgrates/cgrates/engine" "github.com/cgrates/cgrates/utils" "github.com/howeyc/fsnotify" "os" @@ -35,7 +35,7 @@ import ( "time" ) -func NewMediator(connector rater.Connector, storDb rater.DataStorage, cfg *config.CGRConfig) (m *Mediator, err error) { +func NewMediator(connector engine.Connector, storDb engine.DataStorage, cfg *config.CGRConfig) (m *Mediator, err error) { m = &Mediator{ connector: connector, storDb: storDb, @@ -51,8 +51,8 @@ func NewMediator(connector rater.Connector, storDb rater.DataStorage, cfg *confi } type Mediator struct { - connector rater.Connector - storDb rater.DataStorage + connector engine.Connector + storDb engine.DataStorage cgrCfg *config.CGRConfig cdrInDir, cdrOutDir string accIdField string @@ -145,32 +145,32 @@ func (self *Mediator) TrackCDRFiles() (err error) { if err != nil { return } - rater.Logger.Info(fmt.Sprintf("Monitoring %s for file moves.", self.cdrInDir)) + engine.Logger.Info(fmt.Sprintf("Monitoring %s for file moves.", self.cdrInDir)) for { select { case ev := <-watcher.Event: if ev.IsCreate() && path.Ext(ev.Name) != ".csv" { - rater.Logger.Info(fmt.Sprintf("Parsing: %s", ev.Name)) + engine.Logger.Info(fmt.Sprintf("Parsing: %s", ev.Name)) err = self.MediateCSVCDR(ev.Name) if err != nil { return err } } case err := <-watcher.Error: - rater.Logger.Err(fmt.Sprintf("Inotify error: %s", err.Error())) + engine.Logger.Err(fmt.Sprintf("Inotify error: %s", err.Error())) } } return } // Retrive the cost from logging database -func (self *Mediator) getCostsFromDB(cdr utils.CDR) (cc *rater.CallCost, err error) { - return self.storDb.GetCallCostLog(cdr.GetCgrId(), rater.SESSION_MANAGER_SOURCE) +func (self *Mediator) getCostsFromDB(cdr utils.CDR) (cc *engine.CallCost, err error) { + return self.storDb.GetCallCostLog(cdr.GetCgrId(), engine.SESSION_MANAGER_SOURCE) } -// Retrive the cost from rater -func (self *Mediator) getCostsFromRater(cdr utils.CDR) (*rater.CallCost, error) { - cc := &rater.CallCost{} +// Retrive the cost from engine +func (self *Mediator) getCostsFromRater(cdr utils.CDR) (*engine.CallCost, error) { + cc := &engine.CallCost{} d, err := time.ParseDuration(strconv.FormatInt(cdr.GetDuration(), 10) + "s") if err != nil { return nil, err @@ -182,7 +182,7 @@ func (self *Mediator) getCostsFromRater(cdr utils.CDR) (*rater.CallCost, error) if err != nil { return nil, err } - cd := rater.CallDescriptor{ + cd := engine.CallDescriptor{ Direction: "OUT", //record[m.directionFields[runIdx]] TODO: fix me Tenant: cdr.GetTenant(), TOR: cdr.GetTOR(), @@ -197,10 +197,10 @@ func (self *Mediator) getCostsFromRater(cdr utils.CDR) (*rater.CallCost, error) err = self.connector.GetCost(cd, cc) } if err != nil { - self.storDb.LogError(cdr.GetCgrId(), rater.MEDIATOR_SOURCE, err.Error()) + self.storDb.LogError(cdr.GetCgrId(), engine.MEDIATOR_SOURCE, err.Error()) } else { // If the mediator calculated a price it will write it to logdb - self.storDb.LogCallCost(cdr.GetCgrId(), rater.MEDIATOR_SOURCE, cc) + self.storDb.LogCallCost(cdr.GetCgrId(), engine.MEDIATOR_SOURCE, cc) } return cc, nil } @@ -211,7 +211,7 @@ func (self *Mediator) MediateCSVCDR(cdrfn string) (err error) { file, err := os.Open(cdrfn) defer file.Close() if err != nil { - rater.Logger.Crit(err.Error()) + engine.Logger.Crit(err.Error()) os.Exit(1) } csvReader := csv.NewReader(bufio.NewReader(file)) @@ -226,7 +226,7 @@ func (self *Mediator) MediateCSVCDR(cdrfn string) (err error) { w := bufio.NewWriter(fout) for record, ok := csvReader.Read(); ok == nil; record, ok = csvReader.Read() { //t, _ := time.Parse("2006-01-02 15:04:05", record[5]) - var cc *rater.CallCost + var cc *engine.CallCost for runIdx := range self.fieldIdxs["subject"] { // Query costs for every run index given by subject csvCDR, errCDR := NewFScsvCDR(record, self.accIdIdx, @@ -241,7 +241,7 @@ func (self *Mediator) MediateCSVCDR(cdrfn string) (err error) { self.fieldIdxs["duration"][runIdx], self.cgrCfg) if errCDR != nil { - rater.Logger.Err(fmt.Sprintf(" Could not calculate price for accid: <%s>, err: <%s>", + engine.Logger.Err(fmt.Sprintf(" Could not calculate price for accid: <%s>, err: <%s>", record[self.accIdIdx], errCDR.Error())) } var errCost error @@ -253,10 +253,10 @@ func (self *Mediator) MediateCSVCDR(cdrfn string) (err error) { } cost := "-1" if errCost != nil || cc == nil { - rater.Logger.Err(fmt.Sprintf(" Could not calculate price for accid: <%s>, err: <%s>, cost: <%v>", csvCDR.GetAccId(), err.Error(), cc)) + engine.Logger.Err(fmt.Sprintf(" Could not calculate price for accid: <%s>, err: <%s>, cost: <%v>", csvCDR.GetAccId(), err.Error(), cc)) } else { cost = strconv.FormatFloat(cc.ConnectFee+cc.Cost, 'f', -1, 64) - rater.Logger.Debug(fmt.Sprintf("Calculated for accid:%s, cost: %v", csvCDR.GetAccId(), cost)) + engine.Logger.Debug(fmt.Sprintf("Calculated for accid:%s, cost: %v", csvCDR.GetAccId(), cost)) } record = append(record, cost) } @@ -266,8 +266,8 @@ func (self *Mediator) MediateCSVCDR(cdrfn string) (err error) { return } -func (self *Mediator) MediateDBCDR(cdr utils.CDR, db rater.DataStorage) error { - var cc *rater.CallCost +func (self *Mediator) MediateDBCDR(cdr utils.CDR, db engine.DataStorage) error { + var cc *engine.CallCost var errCost error if cdr.GetReqType() == utils.PREPAID || cdr.GetReqType() == utils.POSTPAID { // Should be previously calculated and stored in DB @@ -277,10 +277,10 @@ func (self *Mediator) MediateDBCDR(cdr utils.CDR, db rater.DataStorage) error { } cost := "-1" if errCost != nil || cc == nil { - rater.Logger.Err(fmt.Sprintf(" Could not calculate price for cgrid: <%s>, err: <%s>, cost: <%v>", cdr.GetCgrId(), errCost.Error(), cc)) + engine.Logger.Err(fmt.Sprintf(" Could not calculate price for cgrid: <%s>, err: <%s>, cost: <%v>", cdr.GetCgrId(), errCost.Error(), cc)) } else { cost = strconv.FormatFloat(cc.ConnectFee+cc.Cost, 'f', -1, 64) - rater.Logger.Debug(fmt.Sprintf(" Calculated for cgrid:%s, cost: %v", cdr.GetCgrId(), cost)) + engine.Logger.Debug(fmt.Sprintf(" Calculated for cgrid:%s, cost: %v", cdr.GetCgrId(), cost)) } return self.storDb.SetRatedCdr(cdr, cc) } diff --git a/scheduler/scheduler.go b/scheduler/scheduler.go index 967a3d23b..bde77a620 100644 --- a/scheduler/scheduler.go +++ b/scheduler/scheduler.go @@ -20,13 +20,13 @@ package scheduler import ( "fmt" - "github.com/cgrates/cgrates/rater" + "github.com/cgrates/cgrates/engine" "sort" "time" ) type Scheduler struct { - queue rater.ActionTimingPriotityList + queue engine.ActionTimingPriotityList timer *time.Timer restartLoop chan bool } @@ -43,19 +43,19 @@ func (s *Scheduler) Loop() { a0 := s.queue[0] now := time.Now() if a0.GetNextStartTime().Equal(now) || a0.GetNextStartTime().Before(now) { - rater.Logger.Debug(fmt.Sprintf("%v - %v", a0.Tag, a0.Timing)) + engine.Logger.Debug(fmt.Sprintf("%v - %v", a0.Tag, a0.Timing)) go a0.Execute() s.queue = append(s.queue, a0) s.queue = s.queue[1:] sort.Sort(s.queue) } else { d := a0.GetNextStartTime().Sub(now) - rater.Logger.Info(fmt.Sprintf("Timer set to wait for %v", d)) + engine.Logger.Info(fmt.Sprintf("Timer set to wait for %v", d)) s.timer = time.NewTimer(d) select { case <-s.timer.C: // timer has expired - rater.Logger.Info(fmt.Sprintf("Time for action on %v", s.queue[0])) + engine.Logger.Info(fmt.Sprintf("Time for action on %v", s.queue[0])) case <-s.restartLoop: // nothing to do, just continue the loop } @@ -63,22 +63,22 @@ func (s *Scheduler) Loop() { } } -func (s *Scheduler) LoadActionTimings(storage rater.DataStorage) { +func (s *Scheduler) LoadActionTimings(storage engine.DataStorage) { actionTimings, err := storage.GetAllActionTimings() if err != nil { - rater.Logger.Warning(fmt.Sprintf("Cannot get action timings: %v", err)) + engine.Logger.Warning(fmt.Sprintf("Cannot get action timings: %v", err)) } // recreate the queue - s.queue = rater.ActionTimingPriotityList{} + s.queue = engine.ActionTimingPriotityList{} for key, ats := range actionTimings { toBeSaved := false isAsap := false - newAts := make([]*rater.ActionTiming, 0) // will remove the one time runs from the database + newAts := make([]*engine.ActionTiming, 0) // will remove the one time runs from the database for _, at := range ats { isAsap = at.CheckForASAP() toBeSaved = toBeSaved || isAsap if at.IsOneTimeRun() { - rater.Logger.Info(fmt.Sprintf("Time for one time action on %v", key)) + engine.Logger.Info(fmt.Sprintf("Time for one time action on %v", key)) go at.Execute() // do not append it to the newAts list to be saved } else { diff --git a/sessionmanager/fssessionmanager.go b/sessionmanager/fssessionmanager.go index ec849c4c3..eea13efc4 100644 --- a/sessionmanager/fssessionmanager.go +++ b/sessionmanager/fssessionmanager.go @@ -23,7 +23,7 @@ import ( "errors" "fmt" "github.com/cgrates/cgrates/config" - "github.com/cgrates/cgrates/rater" + "github.com/cgrates/cgrates/engine" "github.com/cgrates/cgrates/utils" "github.com/cgrates/fsock" "log/syslog" @@ -40,12 +40,12 @@ type FSSessionManager struct { conn net.Conn buf *bufio.Reader sessions []*Session - connector rater.Connector + connector engine.Connector debitPeriod time.Duration - loggerDB rater.DataStorage + loggerDB engine.DataStorage } -func NewFSSessionManager(storage rater.DataStorage, connector rater.Connector, debitPeriod time.Duration) *FSSessionManager { +func NewFSSessionManager(storage engine.DataStorage, connector engine.Connector, debitPeriod time.Duration) *FSSessionManager { return &FSSessionManager{loggerDB: storage, connector: connector, debitPeriod: debitPeriod} } @@ -54,7 +54,7 @@ func NewFSSessionManager(storage rater.DataStorage, connector rater.Connector, d func (sm *FSSessionManager) Connect(cgrCfg *config.CGRConfig) (err error) { cfg = cgrCfg // make config global eventFilters := map[string]string{"Call-Direction": "inbound"} - if fsock.FS, err = fsock.NewFSock(cfg.FreeswitchServer, cfg.FreeswitchPass, cfg.FreeswitchReconnects, sm.createHandlers(), eventFilters, rater.Logger.(*syslog.Writer)); err != nil { + if fsock.FS, err = fsock.NewFSock(cfg.FreeswitchServer, cfg.FreeswitchPass, cfg.FreeswitchReconnects, sm.createHandlers(), eventFilters, engine.Logger.(*syslog.Writer)); err != nil { return err } else if !fsock.FS.Connected() { return errors.New("Cannot connect to FreeSWITCH") @@ -100,14 +100,14 @@ func (sm *FSSessionManager) GetSession(uuid string) *Session { // Disconnects a session by sending hangup command to freeswitch func (sm *FSSessionManager) DisconnectSession(s *Session, notify string) { - rater.Logger.Debug(fmt.Sprintf("Session: %+v", s.uuid)) + engine.Logger.Debug(fmt.Sprintf("Session: %+v", s.uuid)) err := fsock.FS.SendApiCmd(fmt.Sprintf("uuid_setvar %s cgr_notify %s\n\n", s.uuid, notify)) if err != nil { - rater.Logger.Err("could not send disconect api notification to freeswitch") + engine.Logger.Err("could not send disconect api notification to freeswitch") } err = fsock.FS.SendMsgCmd(s.uuid, map[string]string{"call-command": "hangup", "hangup-cause": "MANAGER_REQUEST"}) // without + sign if err != nil { - rater.Logger.Err("could not send disconect msg to freeswitch") + engine.Logger.Err("could not send disconect msg to freeswitch") } return } @@ -126,23 +126,23 @@ func (sm *FSSessionManager) RemoveSession(s *Session) { func (sm *FSSessionManager) unparkCall(uuid, call_dest_nb, notify string) { err := fsock.FS.SendApiCmd(fmt.Sprintf("uuid_setvar %s cgr_notify %s\n\n", uuid, notify)) if err != nil { - rater.Logger.Err("could not send unpark api notification to freeswitch") + engine.Logger.Err("could not send unpark api notification to freeswitch") } err = fsock.FS.SendApiCmd(fmt.Sprintf("uuid_transfer %s %s\n\n", uuid, call_dest_nb)) if err != nil { - rater.Logger.Err("could not send unpark api call to freeswitch") + engine.Logger.Err("could not send unpark api call to freeswitch") } } func (sm *FSSessionManager) OnHeartBeat(ev Event) { - rater.Logger.Info("freeswitch ♥") + engine.Logger.Info("freeswitch ♥") } func (sm *FSSessionManager) OnChannelPark(ev Event) { - rater.Logger.Info("freeswitch park") + engine.Logger.Info("freeswitch park") startTime, err := ev.GetStartTime(PARK_TIME) if err != nil { - rater.Logger.Err("Error parsing answer event start time, using time.Now!") + engine.Logger.Err("Error parsing answer event start time, using time.Now!") startTime = time.Now() } // if there is no account configured leave the call alone @@ -151,10 +151,10 @@ func (sm *FSSessionManager) OnChannelPark(ev Event) { } if ev.MissingParameter() { sm.unparkCall(ev.GetUUID(), ev.GetCallDestNr(), MISSING_PARAMETER) - rater.Logger.Err(fmt.Sprintf("Missing parameter for %s", ev.GetUUID())) + engine.Logger.Err(fmt.Sprintf("Missing parameter for %s", ev.GetUUID())) return } - cd := rater.CallDescriptor{ + cd := engine.CallDescriptor{ Direction: ev.GetDirection(), Tenant: ev.GetTenant(), TOR: ev.GetTOR(), @@ -167,13 +167,13 @@ func (sm *FSSessionManager) OnChannelPark(ev Event) { var remainingSeconds float64 err = sm.connector.GetMaxSessionTime(cd, &remainingSeconds) if err != nil { - rater.Logger.Err(fmt.Sprintf("Could not get max session time for %s: %v", ev.GetUUID(), err)) + engine.Logger.Err(fmt.Sprintf("Could not get max session time for %s: %v", ev.GetUUID(), err)) sm.unparkCall(ev.GetUUID(), ev.GetCallDestNr(), SYSTEM_ERROR) return } - rater.Logger.Info(fmt.Sprintf("Remaining seconds: %v", remainingSeconds)) + engine.Logger.Info(fmt.Sprintf("Remaining seconds: %v", remainingSeconds)) if remainingSeconds == 0 { - rater.Logger.Info(fmt.Sprintf("Not enough credit for trasferring the call %s for %s.", ev.GetUUID(), cd.GetKey())) + engine.Logger.Info(fmt.Sprintf("Not enough credit for trasferring the call %s for %s.", ev.GetUUID(), cd.GetKey())) sm.unparkCall(ev.GetUUID(), ev.GetCallDestNr(), INSUFFICIENT_FUNDS) return } @@ -181,7 +181,7 @@ func (sm *FSSessionManager) OnChannelPark(ev Event) { } func (sm *FSSessionManager) OnChannelAnswer(ev Event) { - rater.Logger.Info(" FreeSWITCH answer.") + engine.Logger.Info(" FreeSWITCH answer.") s := NewSession(ev, sm) if s != nil { sm.sessions = append(sm.sessions, s) @@ -189,7 +189,7 @@ func (sm *FSSessionManager) OnChannelAnswer(ev Event) { } func (sm *FSSessionManager) OnChannelHangupComplete(ev Event) { - rater.Logger.Info(" FreeSWITCH hangup.") + engine.Logger.Info(" FreeSWITCH hangup.") s := sm.GetSession(ev.GetUUID()) if s == nil { // Not handled by us return @@ -198,15 +198,15 @@ func (sm *FSSessionManager) OnChannelHangupComplete(ev Event) { if ev.GetReqType() == utils.POSTPAID { startTime, err := ev.GetStartTime(START_TIME) if err != nil { - rater.Logger.Crit("Error parsing postpaid call start time from event") + engine.Logger.Crit("Error parsing postpaid call start time from event") return } endTime, err := ev.GetEndTime() if err != nil { - rater.Logger.Crit("Error parsing postpaid call start time from event") + engine.Logger.Crit("Error parsing postpaid call start time from event") return } - cd := rater.CallDescriptor{ + cd := engine.CallDescriptor{ Direction: ev.GetDirection(), Tenant: ev.GetTenant(), TOR: ev.GetTOR(), @@ -219,10 +219,10 @@ func (sm *FSSessionManager) OnChannelHangupComplete(ev Event) { TimeEnd: endTime, FallbackSubject: ev.GetFallbackSubj(), } - cc := &rater.CallCost{} + cc := &engine.CallCost{} err = sm.connector.Debit(cd, cc) if err != nil { - rater.Logger.Err(fmt.Sprintf("Error making the general debit for postpaid call: %v", ev.GetUUID())) + engine.Logger.Err(fmt.Sprintf("Error making the general debit for postpaid call: %v", ev.GetUUID())) return } s.CallCosts = append(s.CallCosts, cc) @@ -239,7 +239,7 @@ func (sm *FSSessionManager) OnChannelHangupComplete(ev Event) { refoundDuration := end.Sub(start).Seconds() cost := 0.0 seconds := 0.0 - rater.Logger.Info(fmt.Sprintf("Refund duration: %v", refoundDuration)) + engine.Logger.Info(fmt.Sprintf("Refund duration: %v", refoundDuration)) for i := len(lastCC.Timespans) - 1; i >= 0; i-- { ts := lastCC.Timespans[i] tsDuration := ts.GetDuration().Seconds() @@ -268,7 +268,7 @@ func (sm *FSSessionManager) OnChannelHangupComplete(ev Event) { } } if cost > 0 { - cd := &rater.CallDescriptor{ + cd := &engine.CallDescriptor{ Direction: lastCC.Direction, Tenant: lastCC.Tenant, TOR: lastCC.TOR, @@ -281,11 +281,11 @@ func (sm *FSSessionManager) OnChannelHangupComplete(ev Event) { var response float64 err := sm.connector.DebitCents(*cd, &response) if err != nil { - rater.Logger.Err(fmt.Sprintf("Debit cents failed: %v", err)) + engine.Logger.Err(fmt.Sprintf("Debit cents failed: %v", err)) } } if seconds > 0 { - cd := &rater.CallDescriptor{ + cd := &engine.CallDescriptor{ Direction: lastCC.Direction, TOR: lastCC.TOR, Tenant: lastCC.Tenant, @@ -298,33 +298,33 @@ func (sm *FSSessionManager) OnChannelHangupComplete(ev Event) { var response float64 err := sm.connector.DebitSeconds(*cd, &response) if err != nil { - rater.Logger.Err(fmt.Sprintf("Debit seconds failed: %v", err)) + engine.Logger.Err(fmt.Sprintf("Debit seconds failed: %v", err)) } } lastCC.Cost -= cost - rater.Logger.Info(fmt.Sprintf("Rambursed %v cents, %v seconds", cost, seconds)) + engine.Logger.Info(fmt.Sprintf("Rambursed %v cents, %v seconds", cost, seconds)) } -func (sm *FSSessionManager) LoopAction(s *Session, cd *rater.CallDescriptor, index float64) { - cc := &rater.CallCost{} +func (sm *FSSessionManager) LoopAction(s *Session, cd *engine.CallDescriptor, index float64) { + cc := &engine.CallCost{} cd.LoopIndex = index cd.Amount = sm.debitPeriod.Seconds() cd.CallDuration += cd.Amount err := sm.connector.MaxDebit(*cd, cc) if err != nil { - rater.Logger.Err(fmt.Sprintf("Could not complete debit opperation: %v", err)) + engine.Logger.Err(fmt.Sprintf("Could not complete debit opperation: %v", err)) // disconnect session s.sessionManager.DisconnectSession(s, SYSTEM_ERROR) } nbts := len(cc.Timespans) remainingSeconds := 0.0 - rater.Logger.Debug(fmt.Sprintf("Result of MaxDebit call: %v", cc)) + engine.Logger.Debug(fmt.Sprintf("Result of MaxDebit call: %v", cc)) if nbts > 0 { remainingSeconds = cc.Timespans[nbts-1].TimeEnd.Sub(cc.Timespans[0].TimeStart).Seconds() } if remainingSeconds == 0 || err != nil { - rater.Logger.Info(fmt.Sprintf("No credit left: Disconnect %v", s)) + engine.Logger.Info(fmt.Sprintf("No credit left: Disconnect %v", s)) sm.DisconnectSession(s, INSUFFICIENT_FUNDS) return } @@ -333,7 +333,7 @@ func (sm *FSSessionManager) LoopAction(s *Session, cd *rater.CallDescriptor, ind func (sm *FSSessionManager) GetDebitPeriod() time.Duration { return sm.debitPeriod } -func (sm *FSSessionManager) GetDbLogger() rater.DataStorage { +func (sm *FSSessionManager) GetDbLogger() engine.DataStorage { return sm.loggerDB } @@ -341,18 +341,18 @@ func (sm *FSSessionManager) Shutdown() (err error) { if fsock.FS == nil || !fsock.FS.Connected() { return errors.New("Cannot shutdown sessions, fsock not connected") } - rater.Logger.Info("Shutting down all sessions...") + engine.Logger.Info("Shutting down all sessions...") cmdKillPrepaid := "hupall MANAGER_REQUEST cgr_reqtype prepaid" cmdKillPostpaid := "hupall MANAGER_REQUEST cgr_reqtype postpaid" for _, cmd := range []string{cmdKillPrepaid, cmdKillPostpaid} { if err = fsock.FS.SendApiCmd(cmd); err != nil { - rater.Logger.Err(fmt.Sprintf("Error on calls shutdown: %s", err)) + engine.Logger.Err(fmt.Sprintf("Error on calls shutdown: %s", err)) return } } for guard := 0; len(sm.sessions) > 0 && guard < 20; guard++ { time.Sleep(100 * time.Millisecond) // wait for the hungup event to be fired - rater.Logger.Info(fmt.Sprintf(" Shutdown waiting on sessions: %v", sm.sessions)) + engine.Logger.Info(fmt.Sprintf(" Shutdown waiting on sessions: %v", sm.sessions)) } return } diff --git a/sessionmanager/session.go b/sessionmanager/session.go index aa25f0c10..72bd7da38 100644 --- a/sessionmanager/session.go +++ b/sessionmanager/session.go @@ -20,7 +20,7 @@ package sessionmanager import ( "fmt" - "github.com/cgrates/cgrates/rater" + "github.com/cgrates/cgrates/engine" "github.com/cgrates/cgrates/utils" "github.com/cgrates/fsock" "time" @@ -30,10 +30,10 @@ import ( // actions and a channel to signal end of the debit loop. type Session struct { uuid string - callDescriptor *rater.CallDescriptor + callDescriptor *engine.CallDescriptor sessionManager SessionManager stopDebit chan bool - CallCosts []*rater.CallCost + CallCosts []*engine.CallCost } // Creates a new session and starts the debit loop @@ -44,15 +44,15 @@ func NewSession(ev Event, sm SessionManager) (s *Session) { } // Make sure cgr_type is enforced even if not set by FreeSWITCH if err := fsock.FS.SendApiCmd(fmt.Sprintf("uuid_setvar %s cgr_reqtype %s\n\n", ev.GetUUID(), ev.GetReqType())); err != nil { - rater.Logger.Err(fmt.Sprintf("Error on attempting to overwrite cgr_type in chan variables: %v", err)) + engine.Logger.Err(fmt.Sprintf("Error on attempting to overwrite cgr_type in chan variables: %v", err)) } startTime, err := ev.GetStartTime(START_TIME) if err != nil { - rater.Logger.Err("Error parsing answer event start time, using time.Now!") + engine.Logger.Err("Error parsing answer event start time, using time.Now!") startTime = time.Now() } - cd := &rater.CallDescriptor{ + cd := &engine.CallDescriptor{ Direction: ev.GetDirection(), Tenant: ev.GetTenant(), TOR: ev.GetTOR(), @@ -102,7 +102,7 @@ func (s *Session) getSessionDurationFrom(now time.Time) (d time.Duration) { seconds := now.Sub(s.callDescriptor.TimeStart).Seconds() d, err := time.ParseDuration(fmt.Sprintf("%ds", int(seconds))) if err != nil { - rater.Logger.Err(fmt.Sprintf("Cannot parse session duration %v", seconds)) + engine.Logger.Err(fmt.Sprintf("Cannot parse session duration %v", seconds)) } return } @@ -114,7 +114,7 @@ func (s *Session) GetSessionDuration() time.Duration { // Stops the debit loop func (s *Session) Close() { - rater.Logger.Debug(fmt.Sprintf("Stopping debit for %s", s.uuid)) + engine.Logger.Debug(fmt.Sprintf("Stopping debit for %s", s.uuid)) if s == nil { return } @@ -140,9 +140,9 @@ func (s *Session) SaveOperations() { firstCC.Merge(cc) } if s.sessionManager.GetDbLogger() == nil { - rater.Logger.Err(" Error: no connection to logger database, cannot save costs") + engine.Logger.Err(" Error: no connection to logger database, cannot save costs") } - s.sessionManager.GetDbLogger().LogCallCost(s.uuid, rater.SESSION_MANAGER_SOURCE, firstCC) - rater.Logger.Debug(fmt.Sprintf(" End of call, having costs: %v", firstCC.String())) + s.sessionManager.GetDbLogger().LogCallCost(s.uuid, engine.SESSION_MANAGER_SOURCE, firstCC) + engine.Logger.Debug(fmt.Sprintf(" End of call, having costs: %v", firstCC.String())) }() } diff --git a/sessionmanager/sessionmanager.go b/sessionmanager/sessionmanager.go index ba58f25de..b254e3dcd 100644 --- a/sessionmanager/sessionmanager.go +++ b/sessionmanager/sessionmanager.go @@ -20,7 +20,7 @@ package sessionmanager import ( "github.com/cgrates/cgrates/config" - "github.com/cgrates/cgrates/rater" + "github.com/cgrates/cgrates/engine" "time" ) @@ -28,8 +28,8 @@ type SessionManager interface { Connect(*config.CGRConfig) error DisconnectSession(*Session, string) RemoveSession(*Session) - LoopAction(*Session, *rater.CallDescriptor, float64) + LoopAction(*Session, *engine.CallDescriptor, float64) GetDebitPeriod() time.Duration - GetDbLogger() rater.DataStorage + GetDbLogger() engine.DataStorage Shutdown() error }