diff --git a/apier/v1/accounts.go b/apier/v1/accounts.go index fe9079c82..b571dad59 100644 --- a/apier/v1/accounts.go +++ b/apier/v1/accounts.go @@ -155,7 +155,7 @@ func (self *ApierV1) RemoveActionTiming(attrs AttrRemoveActionTiming, reply *str return utils.NewErrServerError(err) } if attrs.ReloadScheduler { - sched := self.ServManager.GetScheduler() + sched := self.Scheduler.GetScheduler() if sched == nil { return errors.New(utils.SchedulerNotRunningCaps) } @@ -277,7 +277,7 @@ func (self *ApierV1) SetAccount(attr utils.AttrSetAccount, reply *string) (err e return utils.NewErrServerError(err) } if attr.ReloadScheduler && len(dirtyActionPlans) != 0 { - sched := self.ServManager.GetScheduler() + sched := self.Scheduler.GetScheduler() if sched == nil { return errors.New(utils.SchedulerNotRunningCaps) } diff --git a/apier/v1/apier.go b/apier/v1/apier.go index b65995882..99ff2381b 100644 --- a/apier/v1/apier.go +++ b/apier/v1/apier.go @@ -31,11 +31,16 @@ import ( "github.com/cgrates/cgrates/config" "github.com/cgrates/cgrates/engine" "github.com/cgrates/cgrates/guardian" - "github.com/cgrates/cgrates/servmanager" + "github.com/cgrates/cgrates/scheduler" "github.com/cgrates/cgrates/utils" "github.com/cgrates/rpcclient" ) +// SchedulerGeter used to avoid ciclic dependency +type SchedulerGeter interface { + GetScheduler() *scheduler.Scheduler +} + type ApierV1 struct { StorDb engine.LoadStorage DataManager *engine.DataManager @@ -43,12 +48,13 @@ type ApierV1 struct { Config *config.CGRConfig Responder *engine.Responder CDRs rpcclient.RpcClientConnection // FixMe: populate it from cgr-engine - ServManager *servmanager.ServiceManager // Need to have them capitalize so we can export in V2 - HTTPPoster *engine.HTTPPoster - FilterS *engine.FilterS //Used for CDR Exporter - CacheS rpcclient.RpcClientConnection - SchedulerS rpcclient.RpcClientConnection - AttributeS rpcclient.RpcClientConnection + Scheduler SchedulerGeter + // ServManager *servmanager.ServiceManager // Need to have them capitalize so we can export in V2 + HTTPPoster *engine.HTTPPoster + FilterS *engine.FilterS //Used for CDR Exporter + CacheS rpcclient.RpcClientConnection + SchedulerS rpcclient.RpcClientConnection + AttributeS rpcclient.RpcClientConnection } // Call implements rpcclient.RpcClientConnection interface for internal RPC @@ -659,7 +665,7 @@ func (self *ApierV1) SetActionPlan(attrs AttrSetActionPlan, reply *string) (err return err } if attrs.ReloadScheduler { - sched := self.ServManager.GetScheduler() + sched := self.Scheduler.GetScheduler() if sched == nil { return errors.New(utils.SchedulerNotRunningCaps) } @@ -771,7 +777,7 @@ func (self *ApierV1) LoadAccountActions(attrs utils.TPAccountActions, reply *str } // ToDo: Get the action keys loaded by dbReader so we reload only these in cache // Need to do it before scheduler otherwise actions to run will be unknown - sched := self.ServManager.GetScheduler() + sched := self.Scheduler.GetScheduler() if sched != nil { sched.Reload() } diff --git a/apier/v1/scheduler.go b/apier/v1/scheduler.go index 4c2731847..e1cb49f43 100644 --- a/apier/v1/scheduler.go +++ b/apier/v1/scheduler.go @@ -101,7 +101,7 @@ import ( */ func (self *ApierV1) GetScheduledActions(args scheduler.ArgsGetScheduledActions, reply *[]*scheduler.ScheduledAction) error { - sched := self.ServManager.GetScheduler() + sched := self.Scheduler.GetScheduler() if sched == nil { return errors.New(utils.SchedulerNotRunningCaps) } diff --git a/apier/v1/schedulers.go b/apier/v1/schedulers.go index 88e92f2c8..f31cf3b34 100644 --- a/apier/v1/schedulers.go +++ b/apier/v1/schedulers.go @@ -19,24 +19,28 @@ along with this program. If not, see package v1 import ( - "github.com/cgrates/cgrates/servmanager" + "github.com/cgrates/cgrates/config" "github.com/cgrates/cgrates/utils" ) -func NewSchedulerSv1(schdS *servmanager.SchedulerS) *SchedulerSv1 { - return &SchedulerSv1{schdS: schdS} +// NewSchedulerSv1 retuns the API for SchedulerS +func NewSchedulerSv1(cgrcfg *config.CGRConfig) *SchedulerSv1 { + return &SchedulerSv1{cgrcfg: cgrcfg} } // SchedulerSv1 is the RPC object implementing scheduler APIs type SchedulerSv1 struct { - schdS *servmanager.SchedulerS + cgrcfg *config.CGRConfig } // Reload reloads scheduler instructions func (schdSv1 *SchedulerSv1) Reload(arg *utils.CGREventWithArgDispatcher, reply *string) error { - return schdSv1.schdS.V1Reload(arg, reply) + schdSv1.cgrcfg.GetReloadChan(config.SCHEDULER_JSN) <- struct{}{} + *reply = utils.OK + return nil } +// Ping returns Pong func (schdSv1 *SchedulerSv1) Ping(ign *utils.CGREventWithArgDispatcher, reply *string) error { *reply = utils.Pong return nil diff --git a/apier/v2/accounts.go b/apier/v2/accounts.go index 00987983f..67e91fb0c 100644 --- a/apier/v2/accounts.go +++ b/apier/v2/accounts.go @@ -237,7 +237,7 @@ func (self *ApierV2) SetAccount(attr AttrSetAccount, reply *string) error { return utils.NewErrServerError(err) } if attr.ReloadScheduler && schedNeedsReload { - sched := self.ServManager.GetScheduler() + sched := self.Scheduler.GetScheduler() if sched == nil { return errors.New(utils.SchedulerNotRunningCaps) } diff --git a/apier/v2/apier.go b/apier/v2/apier.go index 623c3b408..b1755d538 100644 --- a/apier/v2/apier.go +++ b/apier/v2/apier.go @@ -85,7 +85,7 @@ func (self *ApierV2) LoadAccountActions(attrs AttrLoadAccountActions, reply *str }, config.CgrConfig().GeneralCfg().LockingTimeout, attrs.AccountActionsId); err != nil { return utils.NewErrServerError(err) } - sched := self.ServManager.GetScheduler() + sched := self.Scheduler.GetScheduler() if sched != nil { sched.Reload() } diff --git a/cmd/cgr-engine/cgr-engine.go b/cmd/cgr-engine/cgr-engine.go index 3c75a3ebd..a0b536c58 100644 --- a/cmd/cgr-engine/cgr-engine.go +++ b/cmd/cgr-engine/cgr-engine.go @@ -41,7 +41,6 @@ import ( "github.com/cgrates/cgrates/engine" "github.com/cgrates/cgrates/ers" "github.com/cgrates/cgrates/loaders" - "github.com/cgrates/cgrates/scheduler" "github.com/cgrates/cgrates/services" "github.com/cgrates/cgrates/servmanager" "github.com/cgrates/cgrates/sessions" @@ -786,18 +785,6 @@ func startCDRS(internalCdrSChan, internalRaterChan, internalAttributeSChan, inte internalCdrSChan <- cdrServer // Signal that cdrS is operational } -func startScheduler(internalSchedulerChan chan *scheduler.Scheduler, cacheDoneChan chan struct{}, dm *engine.DataManager, exitChan chan bool) { - // Wait for cache to load data before starting - cacheDone := <-cacheDoneChan - cacheDoneChan <- cacheDone - utils.Logger.Info("Starting CGRateS Scheduler.") - sched := scheduler.NewScheduler(dm) - internalSchedulerChan <- sched - - sched.Loop() - exitChan <- true // Should not get out of loop though -} - // startFilterService fires up the FilterS func startFilterService(filterSChan chan *engine.FilterS, cacheS *engine.CacheS, internalStatSChan, internalResourceSChan, internalRalSChan chan rpcclient.RpcClientConnection, cfg *config.CGRConfig, @@ -978,15 +965,6 @@ func initCoreSv1(internalCoreSv1Chan chan rpcclient.RpcClientConnection, server internalCoreSv1Chan <- cSv1 } -func initSchedulerS(internalSchedSChan chan rpcclient.RpcClientConnection, - srvMngr *servmanager.ServiceManager, server *utils.Server) { - schdS := servmanager.NewSchedulerS(srvMngr) - if !cfg.DispatcherSCfg().Enabled { - server.RpcRegister(v1.NewSchedulerSv1(schdS)) - } - internalSchedSChan <- schdS -} - func initServiceManagerV1(internalServiceManagerChan chan rpcclient.RpcClientConnection, srvMngr *servmanager.ServiceManager, server *utils.Server) { if !cfg.DispatcherSCfg().Enabled { @@ -1385,13 +1363,15 @@ func main() { stS := services.NewStatService() reS := services.NewResourceService() supS := services.NewSupplierService() - srvManager.AddService(attrS, chrS, tS, stS, reS, supS) + schS := services.NewSchedulerService() + srvManager.AddService(attrS, chrS, tS, stS, reS, supS, schS) internalAttributeSChan = attrS.GetIntenternalChan() internalChargerSChan = chrS.GetIntenternalChan() internalThresholdSChan = tS.GetIntenternalChan() internalStatSChan = stS.GetIntenternalChan() internalRsChan = reS.GetIntenternalChan() internalSupplierSChan = supS.GetIntenternalChan() + internalSchedSChan = schS.GetIntenternalChan() go srvManager.StartServices() initServiceManagerV1(internalServeManagerChan, srvManager, server) @@ -1422,22 +1402,14 @@ func main() { engine.IntRPC.AddInternalRPCClient(utils.RALsV1, internalRALsv1Chan) } - // init SchedulerS - initSchedulerS(internalSchedSChan, srvManager, server) - initConfigSv1(internalConfigChan, server) - // Start Scheduler - if cfg.SchedulerCfg().Enabled { - go srvManager.StartScheduler(true) - } - // Start RALs if cfg.RalsCfg().Enabled { go startRater(internalRaterChan, internalApierV1Chan, internalApierV2Chan, internalThresholdSChan, internalStatSChan, internalCacheSChan, internalSchedSChan, internalAttributeSChan, internalDispatcherSChan, internalRALsv1Chan, - srvManager, server, dm, loadDb, cdrDb, cacheS, filterSChan, exitChan) + /*srvManager*/ schS, server, dm, loadDb, cdrDb, cacheS, filterSChan, exitChan) } // Start CDR Server diff --git a/cmd/cgr-engine/rater.go b/cmd/cgr-engine/rater.go index 082947e9f..1aa28cd2a 100755 --- a/cmd/cgr-engine/rater.go +++ b/cmd/cgr-engine/rater.go @@ -25,7 +25,7 @@ import ( v1 "github.com/cgrates/cgrates/apier/v1" v2 "github.com/cgrates/cgrates/apier/v2" "github.com/cgrates/cgrates/engine" - "github.com/cgrates/cgrates/servmanager" + "github.com/cgrates/cgrates/services" "github.com/cgrates/cgrates/utils" "github.com/cgrates/rpcclient" ) @@ -34,7 +34,7 @@ import ( func startRater(internalRaterChan, internalApierv1, internalApierv2, internalThdSChan, internalStatSChan, internalCacheSChan, internalSchedulerSChan, internalAttributeSChan, internalDispatcherSChan, internalRALsChan chan rpcclient.RpcClientConnection, - serviceManager *servmanager.ServiceManager, server *utils.Server, + /*serviceManager *servmanager.ServiceManager*/ schS *services.SchedulerService, server *utils.Server, dm *engine.DataManager, loadDb engine.LoadStorage, cdrDb engine.CdrStorage, chS *engine.CacheS, // separate from channel for optimization filterSChan chan *engine.FilterS, exitChan chan bool) { @@ -158,7 +158,7 @@ func startRater(internalRaterChan, internalApierv1, internalApierv2, internalThd //create scheduler connection var attributeSrpc rpcclient.RpcClientConnection - if len(cfg.ApierCfg().SchedulerConns) != 0 { + if len(cfg.ApierCfg().AttributeSConns) != 0 { attributeSTaskChan := make(chan struct{}) waitTasks = append(waitTasks, attributeSTaskChan) go func() { @@ -205,7 +205,8 @@ func startRater(internalRaterChan, internalApierv1, internalApierv2, internalThd CdrDb: cdrDb, Config: cfg, Responder: responder, - ServManager: serviceManager, + // ServManager: serviceManager, + Scheduler: schS, HTTPPoster: engine.NewHTTPPoster(cfg.GeneralCfg().HttpSkipTlsVerify, cfg.GeneralCfg().ReplyTimeout), FilterS: filterS, diff --git a/config/config.go b/config/config.go index 164fae6c2..e174b1aac 100755 --- a/config/config.go +++ b/config/config.go @@ -1227,7 +1227,10 @@ func (cfg *CGRConfig) MigratorCgrCfg() *MigratorCgrCfg { return cfg.migratorCgrCfg } +// SchedulerCfg returns the config for Scheduler func (cfg *CGRConfig) SchedulerCfg() *SchedulerCfg { + cfg.lks[SCHEDULER_JSN].Lock() + defer cfg.lks[SCHEDULER_JSN].Unlock() return cfg.schedulerCfg } @@ -1472,6 +1475,7 @@ func (cfg *CGRConfig) reloadSection(section string) (err error) { } fallthrough case SCHEDULER_JSN: + cfg.rldChans[SCHEDULER_JSN] <- struct{}{} if !fall { break } @@ -1481,7 +1485,7 @@ func (cfg *CGRConfig) reloadSection(section string) (err error) { break } fallthrough - case FILTERS_JSON: + case FILTERS_JSON: // no need to reload if !fall { break } diff --git a/config/config_defaults.go b/config/config_defaults.go index f5c072551..950a0f3d8 100755 --- a/config/config_defaults.go +++ b/config/config_defaults.go @@ -823,9 +823,7 @@ const CGRATES_CFG_JSON = ` "caches_conns":[ // connections to CacheS for reloads {"address": "*internal"}, ], - "scheduler_conns": [ // connections to SchedulerS for reloads - {"address": "*internal"} - ], + "scheduler_conns": [], // connections to SchedulerS for reloads "attributes_conns": [], // connections to AttributeS for CDRExporter }, diff --git a/config/config_json_test.go b/config/config_json_test.go index 23ad8d044..992dfbbce 100755 --- a/config/config_json_test.go +++ b/config/config_json_test.go @@ -1566,11 +1566,7 @@ func TestDfApierCfg(t *testing.T) { Address: utils.StringPointer(utils.MetaInternal), }, }, - Scheduler_conns: &[]*RemoteHostJson{ - { - Address: utils.StringPointer(utils.MetaInternal), - }, - }, + Scheduler_conns: &[]*RemoteHostJson{}, Attributes_conns: &[]*RemoteHostJson{}, } if cfg, err := dfCgrJsonCfg.ApierCfgJson(); err != nil { diff --git a/config/config_test.go b/config/config_test.go index 023b06377..dbe13cf9a 100755 --- a/config/config_test.go +++ b/config/config_test.go @@ -1767,11 +1767,7 @@ func TestCgrCfgJSONDefaultApierCfg(t *testing.T) { Address: utils.MetaInternal, }, }, - SchedulerConns: []*RemoteHost{ - { - Address: utils.MetaInternal, - }, - }, + SchedulerConns: []*RemoteHost{}, AttributeSConns: []*RemoteHost{}, } if !reflect.DeepEqual(cgrCfg.apier, aCfg) { diff --git a/data/conf/cgrates/cgrates.json b/data/conf/cgrates/cgrates.json index b059ddb7d..77ad138b0 100644 --- a/data/conf/cgrates/cgrates.json +++ b/data/conf/cgrates/cgrates.json @@ -76,7 +76,7 @@ // "client_key":"", // path to client key // "ca_certificate":"", // path to CA certificate (populate for self-signed certificate otherwise let it empty) // "server_policy":4, // server_policy determines the TLS Client Authentication (0-NoClientCert, 1-RequestClientCert, 2-RequireAnyClientCert, 3-VerifyClientCertIfGiven, 4-RequireAndVerifyClientCert) -// "server_name":"", +// "server_name":"", // }, @@ -138,6 +138,7 @@ // "filters": { // Filters configuration (*new) // "stats_conns": [], // connections to StatS for <*stats> filters, empty to disable stats functionality: <""|*internal|x.y.z.y:1234> // "resources_conns": [], // connections to ResourceS for <*resources> filters, empty to disable stats functionality: <""|*internal|x.y.z.y:1234> +// "rals_conns": [], // connections to RALs for <*accounts> filters, empty to disable stats functionality: <""|*internal|x.y.z.y:1234> // }, @@ -171,7 +172,7 @@ // "session_cost_retries": 5, // number of queries to session_costs before recalculating CDR // "chargers_conns": [ // connection to ChargerS for CDR forking, empty to disable billing for CDRs: <""|*internal|x.y.z.y:1234> // {"address": "*internal"} -// ], +// ], // "rals_conns": [ // connections to RALs for cost calculation: <""|*internal|x.y.z.y:1234> // {"address": "*internal"} // ], @@ -272,6 +273,47 @@ // ], +// "ers": { // EventReaderService +// "enabled": false, // starts the EventReader service: +// "sessions_conns": [ // connections to SessionS: <*internal|127.0.0.1:2012> +// {"address": "*internal"} +// ], +// "readers": [ +// { +// "id": "*default", // identifier of the EventReader profile +// "type": "*file_csv", // reader type <*file_csv> +// "field_separator": ",", // separator used in case of csv files +// "run_delay": 0, // sleep interval in seconds between consecutive runs, -1 to use automation via inotify or 0 to disable running all together +// "concurrent_requests": 1024, // maximum simultaneous requests/files to process, 0 for unlimited +// "source_path": "/var/spool/cgrates/cdrc/in", // read data from this path +// "processed_path": "/var/spool/cgrates/cdrc/out", // move processed data here +// "xml_root_path": "", // path towards one event in case of XML CDRs +// "source_id": "ers_csv", // free form field, tag identifying the source of the CDRs within CDRS database +// "tenant": "", // tenant used by import +// "timezone": "", // timezone for timestamps where not specified <""|UTC|Local|$IANA_TZ_DB> +// "filters": [], // limit parsing based on the filters +// "flags": [], // flags to influence the event processing +// "header_fields": [], // template of the import header fields +// "content_fields":[ // import content_fields template, tag will match internally CDR field, in case of .csv value will be represented by index of the field value +// {"tag": "TOR", "field_id": "ToR", "type": "*composed", "value": "~*req.2", "mandatory": true}, +// {"tag": "OriginID", "field_id": "OriginID", "type": "*composed", "value": "~*req.3", "mandatory": true}, +// {"tag": "RequestType", "field_id": "RequestType", "type": "*composed", "value": "~*req.4", "mandatory": true}, +// {"tag": "Tenant", "field_id": "Tenant", "type": "*composed", "value": "~*req.6", "mandatory": true}, +// {"tag": "Category", "field_id": "Category", "type": "*composed", "value": "~*req.7", "mandatory": true}, +// {"tag": "Account", "field_id": "Account", "type": "*composed", "value": "~*req.8", "mandatory": true}, +// {"tag": "Subject", "field_id": "Subject", "type": "*composed", "value": "~*req.9", "mandatory": true}, +// {"tag": "Destination", "field_id": "Destination", "type": "*composed", "value": "~*req.10", "mandatory": true}, +// {"tag": "SetupTime", "field_id": "SetupTime", "type": "*composed", "value": "~*req.11", "mandatory": true}, +// {"tag": "AnswerTime", "field_id": "AnswerTime", "type": "*composed", "value": "~*req.12", "mandatory": true}, +// {"tag": "Usage", "field_id": "Usage", "type": "*composed", "value": "~*req.13", "mandatory": true}, +// ], +// "trailer_fields": [], // template of the import trailer fields +// "continue": false, // continue to the next template if executed +// }, +// ], +// }, + + // "sessions": { // "enabled": false, // starts the session service: // "listen_bijson": "127.0.0.1:2014", // address where to listen for bidirectional JSON-RPC requests @@ -295,7 +337,7 @@ // "session_indexes": [], // index sessions based on these fields for GetActiveSessions API // "client_protocol": 1.0, // version of protocol to use when acting as JSON-PRC client <"0","1.0"> // "channel_sync_interval": "0", // sync channels to detect stale sessions (0 to disable) -// "terminate_attempts": 5 // attempts to get the session before terminating it +// "terminate_attempts": 5 // attempts to get the session before terminating it // }, @@ -355,50 +397,50 @@ // "origin_realm": "cgrates.org", // diameter Origin-Realm AVP used in replies // "vendor_id": 0, // diameter Vendor-Id AVP used in replies // "product_name": "CGRateS", // diameter Product-Name AVP used in replies -// "max_active_requests": -1, // limit the number of active requests processed by the server <-1|0-n> +// "concurrent_requests": -1, // limit the number of active requests processed by the server <-1|0-n> // "synced_conn_requests": false, // process one request at the time per connection // "asr_template": "", // enable AbortSession message being sent to client on DisconnectSession // "templates":{ // default message templates // "*err": [ -// {"tag": "SessionId", "field_id": "Session-Id", "type": "*composed", +// {"tag": "SessionId", "field_id": "Session-Id", "type": "*composed", // "value": "~*req.Session-Id", "mandatory": true}, -// {"tag": "OriginHost", "field_id": "Origin-Host", "type": "*composed", +// {"tag": "OriginHost", "field_id": "Origin-Host", "type": "*composed", // "value": "~*vars.OriginHost", "mandatory": true}, -// {"tag": "OriginRealm", "field_id": "Origin-Realm", "type": "*composed", +// {"tag": "OriginRealm", "field_id": "Origin-Realm", "type": "*composed", // "value": "~*vars.OriginRealm", "mandatory": true}, // ], // "*cca": [ -// {"tag": "SessionId", "field_id": "Session-Id", "type": "*composed", +// {"tag": "SessionId", "field_id": "Session-Id", "type": "*composed", // "value": "~*req.Session-Id", "mandatory": true}, -// {"tag": "ResultCode", "field_id": "Result-Code", "type": "*constant", +// {"tag": "ResultCode", "field_id": "Result-Code", "type": "*constant", // "value": "2001"}, -// {"tag": "OriginHost", "field_id": "Origin-Host", "type": "*composed", +// {"tag": "OriginHost", "field_id": "Origin-Host", "type": "*composed", // "value": "~*vars.OriginHost", "mandatory": true}, -// {"tag": "OriginRealm", "field_id": "Origin-Realm", "type": "*composed", +// {"tag": "OriginRealm", "field_id": "Origin-Realm", "type": "*composed", // "value": "~*vars.OriginRealm", "mandatory": true}, // {"tag": "AuthApplicationId", "field_id": "Auth-Application-Id", "type": "*composed", // "value": "~*vars.*appid", "mandatory": true}, -// {"tag": "CCRequestType", "field_id": "CC-Request-Type", "type": "*composed", +// {"tag": "CCRequestType", "field_id": "CC-Request-Type", "type": "*composed", // "value": "~*req.CC-Request-Type", "mandatory": true}, -// {"tag": "CCRequestNumber", "field_id": "CC-Request-Number", "type": "*composed", +// {"tag": "CCRequestNumber", "field_id": "CC-Request-Number", "type": "*composed", // "value": "~*req.CC-Request-Number", "mandatory": true}, // ], // "*asr": [ -// {"tag": "SessionId", "field_id": "Session-Id", "type": "*variable", +// {"tag": "SessionId", "field_id": "Session-Id", "type": "*variable", // "value": "~*req.Session-Id", "mandatory": true}, -// {"tag": "OriginHost", "field_id": "Origin-Host", "type": "*variable", +// {"tag": "OriginHost", "field_id": "Origin-Host", "type": "*variable", // "value": "~*req.Destination-Host", "mandatory": true}, -// {"tag": "OriginRealm", "field_id": "Origin-Realm", "type": "*variable", +// {"tag": "OriginRealm", "field_id": "Origin-Realm", "type": "*variable", // "value": "~*req.Destination-Realm", "mandatory": true}, -// {"tag": "DestinationRealm", "field_id": "Destination-Realm", "type": "*variable", +// {"tag": "DestinationRealm", "field_id": "Destination-Realm", "type": "*variable", // "value": "~*req.Origin-Realm", "mandatory": true}, -// {"tag": "DestinationHost", "field_id": "Destination-Host", "type": "*variable", +// {"tag": "DestinationHost", "field_id": "Destination-Host", "type": "*variable", // "value": "~*req.Origin-Host", "mandatory": true}, // {"tag": "AuthApplicationId", "field_id": "Auth-Application-Id", "type": "*variable", // "value": "~*vars.*appid", "mandatory": true}, -// {"tag": "UserName", "field_id": "User-Name", "type": "*variable", +// {"tag": "UserName", "field_id": "User-Name", "type": "*variable", // "value": "~*req.User-Name", "mandatory": true}, -// {"tag": "OriginStateID", "field_id": "Origin-State-Id", "type": "*constant", +// {"tag": "OriginStateID", "field_id": "Origin-State-Id", "type": "*constant", // "value": "1"}, // ] // }, @@ -499,10 +541,11 @@ // "attributes_conns": [], // connections to AttributeS for altering events before supplier queries: <""|*internal|127.0.0.1:2013> // "resources_conns": [], // connections to ResourceS for *res sorting, empty to disable functionality: <""|*internal|x.y.z.y:1234> // "stats_conns": [], // connections to StatS for *stats sorting, empty to disable stats functionality: <""|*internal|x.y.z.y:1234> +// "default_ratio":1 // default ratio used in case of *load strategy // }, -// "loaders": [ // LoaderS config +// "loaders": [ // LoaderS config // { // "id": "*default", // identifier of the Loader // "enabled": false, // starts as service: . @@ -545,7 +588,7 @@ // {"tag": "FilterFieldValues", "field_id": "FilterFieldValues", "type": "*variable", "value": "~4"}, // {"tag": "ActivationInterval", "field_id": "ActivationInterval", "type": "*variable", "value": "~5"}, // ], -// }, +// }, // { // "type": "*resources", // data source type // "file_name": "Resources.csv", // file name in the tp_in_dir @@ -655,7 +698,7 @@ // }, // { // "type": "*dispatcher_hosts", // data source type -// "file_name": "DispatcherHosts.csv", // file name in the tp_in_dir +// "file_name": "DispatcherHosts.csv", // file name in the tp_in_dir // "fields": [ // {"tag": "Tenant", "field_id": "Tenant", "type": "*variable", "value": "~0", "mandatory": true}, // {"tag": "ID", "field_id": "ID", "type": "*variable", "value": "~1", "mandatory": true}, @@ -753,13 +796,11 @@ // }, -// "apier": { +// "apier": { // "caches_conns":[ // connections to CacheS for reloads // {"address": "*internal"}, // ], -// "scheduler_conns": [ // connections to SchedulerS for reloads -// {"address": "*internal"} -// ], +// "scheduler_conns": [], // connections to SchedulerS for reloads // "attributes_conns": [], // connections to AttributeS for CDRExporter // }, diff --git a/data/conf/samples/acc_balance_keep/cgrates.json b/data/conf/samples/acc_balance_keep/cgrates.json index a667a4864..bac65ab15 100644 --- a/data/conf/samples/acc_balance_keep/cgrates.json +++ b/data/conf/samples/acc_balance_keep/cgrates.json @@ -134,4 +134,11 @@ }, +"apier": { + "scheduler_conns": [ // connections to SchedulerS for reloads + {"address": "*internal"}, + ], +}, + + } diff --git a/data/conf/samples/actions/cgradmin.json b/data/conf/samples/actions/cgradmin.json index 8674f50b0..b2c402a99 100644 --- a/data/conf/samples/actions/cgradmin.json +++ b/data/conf/samples/actions/cgradmin.json @@ -51,4 +51,10 @@ "store_interval": "1s", }, +"apier": { + "scheduler_conns": [ // connections to SchedulerS for reloads + {"address": "*internal"}, + ], +}, + } diff --git a/data/conf/samples/apier/apier.json b/data/conf/samples/apier/apier.json index 6d6c96f60..8a63f40eb 100644 --- a/data/conf/samples/apier/apier.json +++ b/data/conf/samples/apier/apier.json @@ -78,4 +78,10 @@ }, +"apier": { + "scheduler_conns": [ // connections to SchedulerS for reloads + {"address": "*internal"}, + ], +}, + } diff --git a/data/conf/samples/cdrcflatstore/cgrates.json b/data/conf/samples/cdrcflatstore/cgrates.json index 7f2a23e8c..dc0b66f0c 100644 --- a/data/conf/samples/cdrcflatstore/cgrates.json +++ b/data/conf/samples/cdrcflatstore/cgrates.json @@ -68,4 +68,10 @@ }, ], +"apier": { + "scheduler_conns": [ // connections to SchedulerS for reloads + {"address": "*internal"}, + ], +}, + } diff --git a/data/conf/samples/cdrcfwv/cgrates.json b/data/conf/samples/cdrcfwv/cgrates.json index 8b6c49004..00285fe89 100644 --- a/data/conf/samples/cdrcfwv/cgrates.json +++ b/data/conf/samples/cdrcfwv/cgrates.json @@ -75,4 +75,10 @@ }, ], +"apier": { + "scheduler_conns": [ // connections to SchedulerS for reloads + {"address": "*internal"}, + ], +}, + } diff --git a/data/conf/samples/cdrcfwvwithfilter/cgrates.json b/data/conf/samples/cdrcfwvwithfilter/cgrates.json index a7c3b4e74..c8afc93f0 100755 --- a/data/conf/samples/cdrcfwvwithfilter/cgrates.json +++ b/data/conf/samples/cdrcfwvwithfilter/cgrates.json @@ -119,4 +119,10 @@ }, ], +"apier": { + "scheduler_conns": [ // connections to SchedulerS for reloads + {"address": "*internal"}, + ], +}, + } diff --git a/data/conf/samples/cdrewithfilter/cgrates.json b/data/conf/samples/cdrewithfilter/cgrates.json index 0f2f9fcf6..0db793550 100755 --- a/data/conf/samples/cdrewithfilter/cgrates.json +++ b/data/conf/samples/cdrewithfilter/cgrates.json @@ -137,4 +137,11 @@ }, +"apier": { + "scheduler_conns": [ // connections to SchedulerS for reloads + {"address": "*internal"}, + ], +}, + + } diff --git a/data/conf/samples/cdrsv2mongo/cgrates.json b/data/conf/samples/cdrsv2mongo/cgrates.json index 31c2b485d..33e534f0f 100644 --- a/data/conf/samples/cdrsv2mongo/cgrates.json +++ b/data/conf/samples/cdrsv2mongo/cgrates.json @@ -68,4 +68,10 @@ ], }, +"apier": { + "scheduler_conns": [ // connections to SchedulerS for reloads + {"address": "*internal"}, + ], +}, + } diff --git a/data/conf/samples/cdrsv2mysql/cdrsv2mysql.json b/data/conf/samples/cdrsv2mysql/cdrsv2mysql.json index 333471b99..364a19179 100644 --- a/data/conf/samples/cdrsv2mysql/cdrsv2mysql.json +++ b/data/conf/samples/cdrsv2mysql/cdrsv2mysql.json @@ -68,4 +68,10 @@ ], }, +"apier": { + "scheduler_conns": [ // connections to SchedulerS for reloads + {"address": "*internal"}, + ], +}, + } diff --git a/data/conf/samples/cdrsv2psql/cdrsv2psql.json b/data/conf/samples/cdrsv2psql/cdrsv2psql.json index 3188cd121..5f2d56480 100644 --- a/data/conf/samples/cdrsv2psql/cdrsv2psql.json +++ b/data/conf/samples/cdrsv2psql/cdrsv2psql.json @@ -68,4 +68,10 @@ ], }, +"apier": { + "scheduler_conns": [ // connections to SchedulerS for reloads + {"address": "*internal"}, + ], +}, + } diff --git a/data/conf/samples/cgradmin/cgradmin.json b/data/conf/samples/cgradmin/cgradmin.json index 593043c15..212c3d648 100644 --- a/data/conf/samples/cgradmin/cgradmin.json +++ b/data/conf/samples/cgradmin/cgradmin.json @@ -39,4 +39,10 @@ "enabled": true, // starts users service: . }, +"apier": { + "scheduler_conns": [ // connections to SchedulerS for reloads + {"address": "*internal"}, + ], +}, + } diff --git a/data/conf/samples/cluelrn/cgrates.json b/data/conf/samples/cluelrn/cgrates.json index 317767370..98295b407 100644 --- a/data/conf/samples/cluelrn/cgrates.json +++ b/data/conf/samples/cluelrn/cgrates.json @@ -57,4 +57,10 @@ }, +"apier": { + "scheduler_conns": [ // connections to SchedulerS for reloads + {"address": "*internal"}, + ], +}, + } diff --git a/data/conf/samples/dbinternal/cgrates.json b/data/conf/samples/dbinternal/cgrates.json index 783af92fb..fa0938a2a 100755 --- a/data/conf/samples/dbinternal/cgrates.json +++ b/data/conf/samples/dbinternal/cgrates.json @@ -86,4 +86,10 @@ "out_stordb_type": "internal", }, +"apier": { + "scheduler_conns": [ // connections to SchedulerS for reloads + {"address": "*internal"}, + ], +}, + } diff --git a/data/conf/samples/diamagent/cgrates.json b/data/conf/samples/diamagent/cgrates.json index b4b4716dc..88ba19213 100644 --- a/data/conf/samples/diamagent/cgrates.json +++ b/data/conf/samples/diamagent/cgrates.json @@ -71,4 +71,10 @@ "asr_template": "*asr", }, +"apier": { + "scheduler_conns": [ // connections to SchedulerS for reloads + {"address": "*internal"}, + ], +}, + } diff --git a/data/conf/samples/diamagentmaxconn/cgrates.json b/data/conf/samples/diamagentmaxconn/cgrates.json index b1d677c92..285c8879a 100755 --- a/data/conf/samples/diamagentmaxconn/cgrates.json +++ b/data/conf/samples/diamagentmaxconn/cgrates.json @@ -83,4 +83,10 @@ ], }, +"apier": { + "scheduler_conns": [ // connections to SchedulerS for reloads + {"address": "*internal"}, + ], +}, + } diff --git a/data/conf/samples/diamsctpagent/cgrates.json b/data/conf/samples/diamsctpagent/cgrates.json index 4a3ac47fb..36ee4182f 100755 --- a/data/conf/samples/diamsctpagent/cgrates.json +++ b/data/conf/samples/diamsctpagent/cgrates.json @@ -75,4 +75,10 @@ ], }, +"apier": { + "scheduler_conns": [ // connections to SchedulerS for reloads + {"address": "*internal"}, + ], +}, + } diff --git a/data/conf/samples/dispatchers/all/cgrates.json b/data/conf/samples/dispatchers/all/cgrates.json index ddc578545..613d531e3 100644 --- a/data/conf/samples/dispatchers/all/cgrates.json +++ b/data/conf/samples/dispatchers/all/cgrates.json @@ -93,7 +93,10 @@ "apier": { "caches_conns":[ // connections to CacheS for reloads {"address": "127.0.0.1:6012", "transport": "*json"}, - ], + ], + "scheduler_conns": [ // connections to SchedulerS for reloads + {"address": "*internal"}, + ], }, } diff --git a/data/conf/samples/dispatchers/all2/cgrates.json b/data/conf/samples/dispatchers/all2/cgrates.json index 07644a733..f8ec89882 100644 --- a/data/conf/samples/dispatchers/all2/cgrates.json +++ b/data/conf/samples/dispatchers/all2/cgrates.json @@ -93,7 +93,11 @@ "apier": { "caches_conns":[ // connections to CacheS for reloads {"address": "127.0.0.1:7012", "transport": "*json"}, - ], + ], + "scheduler_conns": [ // connections to SchedulerS for reloads + {"address": "*internal"}, + ], }, + } diff --git a/data/conf/samples/dispatchers/diamagent/cgrates.json b/data/conf/samples/dispatchers/diamagent/cgrates.json index d685a7043..1d8ee4ae1 100644 --- a/data/conf/samples/dispatchers/diamagent/cgrates.json +++ b/data/conf/samples/dispatchers/diamagent/cgrates.json @@ -54,4 +54,9 @@ "asr_template": "*asr", }, +"apier": { + "scheduler_conns": [ // connections to SchedulerS for reloads + {"address": "*internal"}, + ], +}, } diff --git a/data/conf/samples/dispatchers/dispatchers/cgrates.json b/data/conf/samples/dispatchers/dispatchers/cgrates.json index 45186d5b9..6169446f5 100755 --- a/data/conf/samples/dispatchers/dispatchers/cgrates.json +++ b/data/conf/samples/dispatchers/dispatchers/cgrates.json @@ -64,4 +64,9 @@ ], }, +"apier": { + "scheduler_conns": [ // connections to SchedulerS for reloads + {"address": "*internal"}, + ], +}, } \ No newline at end of file diff --git a/data/conf/samples/dispatchers/dispatchers_mongo/cgrates.json b/data/conf/samples/dispatchers/dispatchers_mongo/cgrates.json index ea4874c4a..c2c0d04a8 100644 --- a/data/conf/samples/dispatchers/dispatchers_mongo/cgrates.json +++ b/data/conf/samples/dispatchers/dispatchers_mongo/cgrates.json @@ -72,4 +72,9 @@ ], }, +"apier": { + "scheduler_conns": [ // connections to SchedulerS for reloads + {"address": "*internal"}, + ], +}, } \ No newline at end of file diff --git a/data/conf/samples/dispatchers/dispatchers_no_attributes/cgrates.json b/data/conf/samples/dispatchers/dispatchers_no_attributes/cgrates.json index 27f0f2181..fa27b5126 100755 --- a/data/conf/samples/dispatchers/dispatchers_no_attributes/cgrates.json +++ b/data/conf/samples/dispatchers/dispatchers_no_attributes/cgrates.json @@ -44,4 +44,9 @@ "enabled": true, }, +"apier": { + "scheduler_conns": [ // connections to SchedulerS for reloads + {"address": "*internal"}, + ], +}, } \ No newline at end of file diff --git a/data/conf/samples/dispatchers/radagent/cgrates.json b/data/conf/samples/dispatchers/radagent/cgrates.json index 7a7cda5e7..9c7587016 100644 --- a/data/conf/samples/dispatchers/radagent/cgrates.json +++ b/data/conf/samples/dispatchers/radagent/cgrates.json @@ -139,4 +139,9 @@ }, +"apier": { + "scheduler_conns": [ // connections to SchedulerS for reloads + {"address": "*internal"}, + ], +}, } diff --git a/data/conf/samples/dnsagent/cgrates.json b/data/conf/samples/dnsagent/cgrates.json index 0db8fe045..9be97eb78 100644 --- a/data/conf/samples/dnsagent/cgrates.json +++ b/data/conf/samples/dnsagent/cgrates.json @@ -82,4 +82,9 @@ }, +"apier": { + "scheduler_conns": [ // connections to SchedulerS for reloads + {"address": "*internal"}, + ], +}, } \ No newline at end of file diff --git a/data/conf/samples/ers/cgrates.json b/data/conf/samples/ers/cgrates.json index ff581a0e9..35ac07e3f 100644 --- a/data/conf/samples/ers/cgrates.json +++ b/data/conf/samples/ers/cgrates.json @@ -213,4 +213,11 @@ }, +"apier": { + "scheduler_conns": [ // connections to SchedulerS for reloads + {"address": "*internal"}, + ], +}, + + } diff --git a/data/conf/samples/ers_example/cgrates.json b/data/conf/samples/ers_example/cgrates.json index 6def9bb9a..dfc31e548 100644 --- a/data/conf/samples/ers_example/cgrates.json +++ b/data/conf/samples/ers_example/cgrates.json @@ -111,4 +111,9 @@ }, +"apier": { + "scheduler_conns": [ // connections to SchedulerS for reloads + {"address": "*internal"}, + ], +}, } diff --git a/data/conf/samples/ers_reload/disabled/cgrates.json b/data/conf/samples/ers_reload/disabled/cgrates.json index a2368be8c..0f88e2596 100644 --- a/data/conf/samples/ers_reload/disabled/cgrates.json +++ b/data/conf/samples/ers_reload/disabled/cgrates.json @@ -80,4 +80,11 @@ }, +"apier": { + "scheduler_conns": [ // connections to SchedulerS for reloads + {"address": "*internal"}, + ], +}, + + } diff --git a/data/conf/samples/ers_reload/first_reload/cgrates.json b/data/conf/samples/ers_reload/first_reload/cgrates.json index 6aa44f4b5..40d8e5849 100644 --- a/data/conf/samples/ers_reload/first_reload/cgrates.json +++ b/data/conf/samples/ers_reload/first_reload/cgrates.json @@ -124,4 +124,11 @@ }, +"apier": { + "scheduler_conns": [ // connections to SchedulerS for reloads + {"address": "*internal"}, + ], +}, + + } diff --git a/data/conf/samples/ers_reload/second_reload/cgrates.json b/data/conf/samples/ers_reload/second_reload/cgrates.json index ff581a0e9..35ac07e3f 100644 --- a/data/conf/samples/ers_reload/second_reload/cgrates.json +++ b/data/conf/samples/ers_reload/second_reload/cgrates.json @@ -213,4 +213,11 @@ }, +"apier": { + "scheduler_conns": [ // connections to SchedulerS for reloads + {"address": "*internal"}, + ], +}, + + } diff --git a/data/conf/samples/filters/cgrates.json b/data/conf/samples/filters/cgrates.json index e7acbcb79..a7df763df 100644 --- a/data/conf/samples/filters/cgrates.json +++ b/data/conf/samples/filters/cgrates.json @@ -75,7 +75,11 @@ "apier": { "caches_conns":[ // connections to CacheS for reloads {"address": "127.0.0.1:2012", "transport": "*json"}, - ], + ], + "scheduler_conns": [ // connections to SchedulerS for reloads + {"address": "*internal"}, + ], }, + } diff --git a/data/conf/samples/fscsv/cgrates.json b/data/conf/samples/fscsv/cgrates.json index 317d21199..c1f433448 100644 --- a/data/conf/samples/fscsv/cgrates.json +++ b/data/conf/samples/fscsv/cgrates.json @@ -18,4 +18,10 @@ "enabled": true, // start the CDR Server service: }, +"apier": { + "scheduler_conns": [ // connections to SchedulerS for reloads + {"address": "*internal"}, + ], +}, + } diff --git a/data/conf/samples/hapool/cgrrater1/cgr.json b/data/conf/samples/hapool/cgrrater1/cgr.json index 883e43e94..eeaef7bdd 100644 --- a/data/conf/samples/hapool/cgrrater1/cgr.json +++ b/data/conf/samples/hapool/cgrrater1/cgr.json @@ -18,4 +18,10 @@ "indexes": ["SubscriberId"], }, +"apier": { + "scheduler_conns": [ // connections to SchedulerS for reloads + {"address": "*internal"}, + ], +}, + } diff --git a/data/conf/samples/hapool/cgrrater2/cgr.json b/data/conf/samples/hapool/cgrrater2/cgr.json index 7f848d66a..7e01b98f1 100644 --- a/data/conf/samples/hapool/cgrrater2/cgr.json +++ b/data/conf/samples/hapool/cgrrater2/cgr.json @@ -19,4 +19,10 @@ "indexes": ["SubscriberId"], }, +"apier": { + "scheduler_conns": [ // connections to SchedulerS for reloads + {"address": "*internal"}, + ], +}, + } diff --git a/data/conf/samples/httpagent/cgrates.json b/data/conf/samples/httpagent/cgrates.json index b24995005..e2a7ee27c 100644 --- a/data/conf/samples/httpagent/cgrates.json +++ b/data/conf/samples/httpagent/cgrates.json @@ -65,4 +65,11 @@ }, +"apier": { + "scheduler_conns": [ // connections to SchedulerS for reloads + {"address": "*internal"}, + ], +}, + + } diff --git a/data/conf/samples/httpagenttls/cgrates.json b/data/conf/samples/httpagenttls/cgrates.json index 467c40387..46c265683 100755 --- a/data/conf/samples/httpagenttls/cgrates.json +++ b/data/conf/samples/httpagenttls/cgrates.json @@ -78,4 +78,11 @@ }, +"apier": { + "scheduler_conns": [ // connections to SchedulerS for reloads + {"address": "*internal"}, + ], +}, + + } diff --git a/data/conf/samples/loaders/tutmongo/cgrates.json b/data/conf/samples/loaders/tutmongo/cgrates.json index fb5b2a6a2..6dfbdefa3 100644 --- a/data/conf/samples/loaders/tutmongo/cgrates.json +++ b/data/conf/samples/loaders/tutmongo/cgrates.json @@ -179,4 +179,9 @@ }, +"apier": { + "scheduler_conns": [ // connections to SchedulerS for reloads + {"address": "*internal"}, + ], +}, } diff --git a/data/conf/samples/loaders/tutmysql/cgrates.json b/data/conf/samples/loaders/tutmysql/cgrates.json index 5bd21ea47..7a432da2e 100644 --- a/data/conf/samples/loaders/tutmysql/cgrates.json +++ b/data/conf/samples/loaders/tutmysql/cgrates.json @@ -185,4 +185,11 @@ }, +"apier": { + "scheduler_conns": [ // connections to SchedulerS for reloads + {"address": "*internal"}, + ], +}, + + } diff --git a/data/conf/samples/mongoatlas/cgrates.json b/data/conf/samples/mongoatlas/cgrates.json index 0261fe015..f345b37f5 100755 --- a/data/conf/samples/mongoatlas/cgrates.json +++ b/data/conf/samples/mongoatlas/cgrates.json @@ -165,4 +165,11 @@ }, +"apier": { + "scheduler_conns": [ // connections to SchedulerS for reloads + {"address": "*internal"}, + ], +}, + + } diff --git a/data/conf/samples/mongoreplica/cgrates.json b/data/conf/samples/mongoreplica/cgrates.json index 65ebe9793..5789a6ea5 100755 --- a/data/conf/samples/mongoreplica/cgrates.json +++ b/data/conf/samples/mongoreplica/cgrates.json @@ -120,4 +120,11 @@ }, +"apier": { + "scheduler_conns": [ // connections to SchedulerS for reloads + {"address": "*internal"}, + ], +}, + + } diff --git a/data/conf/samples/multiplecdrc/multiplecdrc_fwexport.json b/data/conf/samples/multiplecdrc/multiplecdrc_fwexport.json index 18be6267d..3788dbf7e 100644 --- a/data/conf/samples/multiplecdrc/multiplecdrc_fwexport.json +++ b/data/conf/samples/multiplecdrc/multiplecdrc_fwexport.json @@ -128,4 +128,12 @@ } }, + +"apier": { + "scheduler_conns": [ // connections to SchedulerS for reloads + {"address": "*internal"}, + ], +}, + + } diff --git a/data/conf/samples/osips_training/cgrates.json b/data/conf/samples/osips_training/cgrates.json index 6364f2ab7..f211e6b57 100644 --- a/data/conf/samples/osips_training/cgrates.json +++ b/data/conf/samples/osips_training/cgrates.json @@ -27,4 +27,12 @@ "enabled": true, // start the CDR Server service: }, + +"apier": { + "scheduler_conns": [ // connections to SchedulerS for reloads + {"address": "*internal"}, + ], +}, + + } diff --git a/data/conf/samples/precache/tutmongo/cgrates.json b/data/conf/samples/precache/tutmongo/cgrates.json index 0d90b55ce..8c6fcb2b4 100644 --- a/data/conf/samples/precache/tutmongo/cgrates.json +++ b/data/conf/samples/precache/tutmongo/cgrates.json @@ -81,4 +81,11 @@ }, +"apier": { + "scheduler_conns": [ // connections to SchedulerS for reloads + {"address": "*internal"}, + ], +}, + + } diff --git a/data/conf/samples/precache/tutmysql/cgrates.json b/data/conf/samples/precache/tutmysql/cgrates.json index 9f7de4283..a6ee35a4a 100644 --- a/data/conf/samples/precache/tutmysql/cgrates.json +++ b/data/conf/samples/precache/tutmysql/cgrates.json @@ -72,4 +72,11 @@ }, +"apier": { + "scheduler_conns": [ // connections to SchedulerS for reloads + {"address": "*internal"}, + ], +}, + + } diff --git a/data/conf/samples/radagent/cgrates.json b/data/conf/samples/radagent/cgrates.json index f3808fd29..167f89b7d 100644 --- a/data/conf/samples/radagent/cgrates.json +++ b/data/conf/samples/radagent/cgrates.json @@ -163,10 +163,17 @@ {"tag": "RemoteAddr" , "field_id": "RemoteAddr", "type": "*remote_host"}, ], "reply_fields":[], - }, - + }, ], - }, + + +"apier": { + "scheduler_conns": [ // connections to SchedulerS for reloads + {"address": "*internal"}, + ], +}, + + } diff --git a/data/conf/samples/rpccaching/cgrates.json b/data/conf/samples/rpccaching/cgrates.json index 381dc3500..d8cc34075 100644 --- a/data/conf/samples/rpccaching/cgrates.json +++ b/data/conf/samples/rpccaching/cgrates.json @@ -72,4 +72,11 @@ }, +"apier": { + "scheduler_conns": [ // connections to SchedulerS for reloads + {"address": "*internal"}, + ], +}, + + } \ No newline at end of file diff --git a/data/conf/samples/sessions/cgrates.json b/data/conf/samples/sessions/cgrates.json index 6fa064345..0faba60c7 100644 --- a/data/conf/samples/sessions/cgrates.json +++ b/data/conf/samples/sessions/cgrates.json @@ -107,4 +107,11 @@ }, +"apier": { + "scheduler_conns": [ // connections to SchedulerS for reloads + {"address": "*internal"}, + ], +}, + + } diff --git a/data/conf/samples/smg/cgrates.json b/data/conf/samples/smg/cgrates.json index e2cb1ccbf..4617807d7 100644 --- a/data/conf/samples/smg/cgrates.json +++ b/data/conf/samples/smg/cgrates.json @@ -69,4 +69,12 @@ ], }, + +"apier": { + "scheduler_conns": [ // connections to SchedulerS for reloads + {"address": "*internal"}, + ], +}, + + } diff --git a/data/conf/samples/smg_automatic_debits/cgrates.json b/data/conf/samples/smg_automatic_debits/cgrates.json index 004e30981..48a335635 100644 --- a/data/conf/samples/smg_automatic_debits/cgrates.json +++ b/data/conf/samples/smg_automatic_debits/cgrates.json @@ -48,4 +48,12 @@ ], }, + +"apier": { + "scheduler_conns": [ // connections to SchedulerS for reloads + {"address": "*internal"}, + ], +}, + + } diff --git a/data/conf/samples/smgeneric/cgrates.json b/data/conf/samples/smgeneric/cgrates.json index 8186f6b74..c70011763 100644 --- a/data/conf/samples/smgeneric/cgrates.json +++ b/data/conf/samples/smgeneric/cgrates.json @@ -67,7 +67,10 @@ "apier": { "caches_conns":[ // connections to CacheS for reloads {"address": "127.0.0.1:3012", "transport": "*json"}, - ], + ], + "scheduler_conns": [ // connections to SchedulerS for reloads + {"address": "*internal"}, + ], }, diff --git a/data/conf/samples/smgreplcmaster/cgrates.json b/data/conf/samples/smgreplcmaster/cgrates.json index 7b6c81a29..1e023e1b6 100644 --- a/data/conf/samples/smgreplcmaster/cgrates.json +++ b/data/conf/samples/smgreplcmaster/cgrates.json @@ -56,4 +56,10 @@ ], }, +"apier": { + "scheduler_conns": [ // connections to SchedulerS for reloads + {"address": "*internal"}, + ], +}, + } diff --git a/data/conf/samples/smgreplcslave/cgrates.json b/data/conf/samples/smgreplcslave/cgrates.json index 54579bf1f..192168c71 100644 --- a/data/conf/samples/smgreplcslave/cgrates.json +++ b/data/conf/samples/smgreplcslave/cgrates.json @@ -57,4 +57,10 @@ ], }, +"apier": { + "scheduler_conns": [ // connections to SchedulerS for reloads + {"address": "*internal"}, + ], +}, + } diff --git a/data/conf/samples/tutmongo/cgrates.json b/data/conf/samples/tutmongo/cgrates.json index 491f0376b..4548b093d 100644 --- a/data/conf/samples/tutmongo/cgrates.json +++ b/data/conf/samples/tutmongo/cgrates.json @@ -144,4 +144,11 @@ }, +"apier": { + "scheduler_conns": [ // connections to SchedulerS for reloads + {"address": "*internal"}, + ], +}, + + } diff --git a/data/conf/samples/tutmongo2/cgrates.json b/data/conf/samples/tutmongo2/cgrates.json index 01188ca52..172103467 100644 --- a/data/conf/samples/tutmongo2/cgrates.json +++ b/data/conf/samples/tutmongo2/cgrates.json @@ -172,4 +172,11 @@ }, +"apier": { + "scheduler_conns": [ // connections to SchedulerS for reloads + {"address": "*internal"}, + ], +}, + + } diff --git a/data/conf/samples/tutmongonew/cgrates.json b/data/conf/samples/tutmongonew/cgrates.json index a2b079dcd..92fbda60d 100644 --- a/data/conf/samples/tutmongonew/cgrates.json +++ b/data/conf/samples/tutmongonew/cgrates.json @@ -139,4 +139,11 @@ }, +"apier": { + "scheduler_conns": [ // connections to SchedulerS for reloads + {"address": "*internal"}, + ], +}, + + } diff --git a/data/conf/samples/tutmysql/cgrates.json b/data/conf/samples/tutmysql/cgrates.json index d6acd82f0..7095eac89 100644 --- a/data/conf/samples/tutmysql/cgrates.json +++ b/data/conf/samples/tutmysql/cgrates.json @@ -147,4 +147,10 @@ }, + +"apier": { + "scheduler_conns": [ // connections to SchedulerS for reloads + {"address": "*internal"}, + ], +}, } diff --git a/data/conf/samples/tutmysql2/cgrates.json b/data/conf/samples/tutmysql2/cgrates.json index 6cfe84a59..2e683020c 100644 --- a/data/conf/samples/tutmysql2/cgrates.json +++ b/data/conf/samples/tutmysql2/cgrates.json @@ -137,4 +137,10 @@ }, + +"apier": { + "scheduler_conns": [ // connections to SchedulerS for reloads + {"address": "*internal"}, + ], +}, } diff --git a/data/conf/samples/tutmysql_internal/cgrates.json b/data/conf/samples/tutmysql_internal/cgrates.json index 2c12c8f3b..96711acfc 100644 --- a/data/conf/samples/tutmysql_internal/cgrates.json +++ b/data/conf/samples/tutmysql_internal/cgrates.json @@ -264,4 +264,11 @@ }, +"apier": { + "scheduler_conns": [ // connections to SchedulerS for reloads + {"address": "*internal"}, + ], +}, + + } diff --git a/data/conf/samples/tutpostgres/cgrates.json b/data/conf/samples/tutpostgres/cgrates.json index 788267f3c..4fce0417a 100644 --- a/data/conf/samples/tutpostgres/cgrates.json +++ b/data/conf/samples/tutpostgres/cgrates.json @@ -107,4 +107,9 @@ }, +"apier": { + "scheduler_conns": [ // connections to SchedulerS for reloads + {"address": "*internal"}, + ], +}, } diff --git a/data/tutorial_tests/asterisk_ari/cgrates/etc/cgrates/cgrates.json b/data/tutorial_tests/asterisk_ari/cgrates/etc/cgrates/cgrates.json index f6c8c3c59..f16f67d05 100644 --- a/data/tutorial_tests/asterisk_ari/cgrates/etc/cgrates/cgrates.json +++ b/data/tutorial_tests/asterisk_ari/cgrates/etc/cgrates/cgrates.json @@ -139,4 +139,9 @@ }, +"apier": { + "scheduler_conns": [ // connections to SchedulerS for reloads + {"address": "*internal"}, + ], +}, } diff --git a/data/tutorial_tests/fs_evsock/cgrates/etc/cgrates/cgrates.json b/data/tutorial_tests/fs_evsock/cgrates/etc/cgrates/cgrates.json index ce7eab8c6..0a395d21f 100644 --- a/data/tutorial_tests/fs_evsock/cgrates/etc/cgrates/cgrates.json +++ b/data/tutorial_tests/fs_evsock/cgrates/etc/cgrates/cgrates.json @@ -136,4 +136,11 @@ }, +"apier": { + "scheduler_conns": [ // connections to SchedulerS for reloads + {"address": "*internal"}, + ], +}, + + } diff --git a/data/tutorial_tests/kamevapi/cgrates/etc/cgrates/cgrates.json b/data/tutorial_tests/kamevapi/cgrates/etc/cgrates/cgrates.json index ff868a184..1b188e04f 100644 --- a/data/tutorial_tests/kamevapi/cgrates/etc/cgrates/cgrates.json +++ b/data/tutorial_tests/kamevapi/cgrates/etc/cgrates/cgrates.json @@ -135,4 +135,11 @@ }, +"apier": { + "scheduler_conns": [ // connections to SchedulerS for reloads + {"address": "*internal"}, + ], +}, + + } diff --git a/data/tutorial_tests/osips/cgrates/etc/cgrates/cgrates.json b/data/tutorial_tests/osips/cgrates/etc/cgrates/cgrates.json index d539ffbac..ca69cd59c 100644 --- a/data/tutorial_tests/osips/cgrates/etc/cgrates/cgrates.json +++ b/data/tutorial_tests/osips/cgrates/etc/cgrates/cgrates.json @@ -133,4 +133,11 @@ }, +"apier": { + "scheduler_conns": [ // connections to SchedulerS for reloads + {"address": "*internal"}, + ], +}, + + } diff --git a/data/tutorials/asterisk_ari/cgrates/etc/cgrates/cgrates.json b/data/tutorials/asterisk_ari/cgrates/etc/cgrates/cgrates.json index f6c8c3c59..4075ad43f 100644 --- a/data/tutorials/asterisk_ari/cgrates/etc/cgrates/cgrates.json +++ b/data/tutorials/asterisk_ari/cgrates/etc/cgrates/cgrates.json @@ -139,4 +139,11 @@ }, +"apier": { + "scheduler_conns": [ // connections to SchedulerS for reloads + {"address": "*internal"}, + ], +}, + + } diff --git a/data/tutorials/fs_evsock/cgrates/etc/cgrates/cgrates.json b/data/tutorials/fs_evsock/cgrates/etc/cgrates/cgrates.json index ce7eab8c6..0a395d21f 100644 --- a/data/tutorials/fs_evsock/cgrates/etc/cgrates/cgrates.json +++ b/data/tutorials/fs_evsock/cgrates/etc/cgrates/cgrates.json @@ -136,4 +136,11 @@ }, +"apier": { + "scheduler_conns": [ // connections to SchedulerS for reloads + {"address": "*internal"}, + ], +}, + + } diff --git a/data/tutorials/kamevapi/cgrates/etc/cgrates/cgrates.json b/data/tutorials/kamevapi/cgrates/etc/cgrates/cgrates.json index e0875a738..679100fca 100644 --- a/data/tutorials/kamevapi/cgrates/etc/cgrates/cgrates.json +++ b/data/tutorials/kamevapi/cgrates/etc/cgrates/cgrates.json @@ -135,4 +135,11 @@ }, +"apier": { + "scheduler_conns": [ // connections to SchedulerS for reloads + {"address": "*internal"}, + ], +}, + + } diff --git a/data/tutorials/osips/cgrates/etc/cgrates/cgrates.json b/data/tutorials/osips/cgrates/etc/cgrates/cgrates.json index b7719ecd5..079dd1b89 100644 --- a/data/tutorials/osips/cgrates/etc/cgrates/cgrates.json +++ b/data/tutorials/osips/cgrates/etc/cgrates/cgrates.json @@ -133,4 +133,11 @@ }, +"apier": { + "scheduler_conns": [ // connections to SchedulerS for reloads + {"address": "*internal"}, + ], +}, + + } diff --git a/data/tutorials/osips_native/cgrates/etc/cgrates/cgrates.json b/data/tutorials/osips_native/cgrates/etc/cgrates/cgrates.json index 0aa8fdbbc..3a5a9ea2a 100644 --- a/data/tutorials/osips_native/cgrates/etc/cgrates/cgrates.json +++ b/data/tutorials/osips_native/cgrates/etc/cgrates/cgrates.json @@ -134,4 +134,11 @@ }, +"apier": { + "scheduler_conns": [ // connections to SchedulerS for reloads + {"address": "*internal"}, + ], +}, + + } diff --git a/services/schedulers.go b/services/schedulers.go new file mode 100644 index 000000000..26764c64e --- /dev/null +++ b/services/schedulers.go @@ -0,0 +1,114 @@ +/* +Real-time Online/Offline Charging System (OCS) for Telecom & ISP environments +Copyright (C) ITsysCOM GmbH + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +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 services + +import ( + "fmt" + "sync" + + v1 "github.com/cgrates/cgrates/apier/v1" + "github.com/cgrates/cgrates/scheduler" + "github.com/cgrates/cgrates/servmanager" + "github.com/cgrates/cgrates/utils" + "github.com/cgrates/rpcclient" +) + +// NewSchedulerService returns the Scheduler Service +func NewSchedulerService() *SchedulerService { + return &SchedulerService{ + connChan: make(chan rpcclient.RpcClientConnection, 1), + } +} + +// SchedulerService implements Service interface +type SchedulerService struct { + sync.RWMutex + schS *scheduler.Scheduler + rpc *v1.SchedulerSv1 + connChan chan rpcclient.RpcClientConnection +} + +// Start should handle the sercive start +func (schS *SchedulerService) Start(sp servmanager.ServiceProvider, waitCache bool) (err error) { + if schS.IsRunning() { + return fmt.Errorf("service aleady running") + } + + schS.Lock() + + if !waitCache { // Wait for cache to load data before starting + <-sp.GetCacheS().GetPrecacheChannel(utils.CacheActionPlans) // wait for ActionPlans to be cached + } + utils.Logger.Info(" Starting CGRateS Scheduler.") + schS.schS = scheduler.NewScheduler(sp.GetDM()) + schS.Unlock() + go schS.schS.Loop() + + schS.rpc = v1.NewSchedulerSv1(sp.GetConfig()) + if !sp.GetConfig().DispatcherSCfg().Enabled { + sp.GetServer().RpcRegister(schS.rpc) + } + schS.connChan <- schS.rpc + + return +} + +// GetIntenternalChan returns the internal connection chanel +func (schS *SchedulerService) GetIntenternalChan() (conn chan rpcclient.RpcClientConnection) { + return schS.connChan +} + +// Reload handles the change of config +func (schS *SchedulerService) Reload(sp servmanager.ServiceProvider) (err error) { + schS.schS.Reload() + return +} + +// Shutdown stops the service +func (schS *SchedulerService) Shutdown() (err error) { + schS.schS.Shutdown() + schS.Lock() + schS.schS = nil + schS.rpc = nil + schS.Unlock() + <-schS.connChan + return +} + +// GetRPCInterface returns the interface to register for server +func (schS *SchedulerService) GetRPCInterface() interface{} { + return schS.rpc +} + +// IsRunning returns if the service is running +func (schS *SchedulerService) IsRunning() bool { + return schS != nil && schS.schS != nil +} + +// ServiceName returns the service name +func (schS *SchedulerService) ServiceName() string { + return utils.SchedulerS +} + +// GetScheduler returns the Scheduler +func (schS *SchedulerService) GetScheduler() *scheduler.Scheduler { + schS.RLock() + defer schS.RUnlock() + return schS.schS +} diff --git a/servmanager/schedulers.go b/servmanager/schedulers.go deleted file mode 100644 index 3f48e57c3..000000000 --- a/servmanager/schedulers.go +++ /dev/null @@ -1,49 +0,0 @@ -/* -Real-time Online/Offline Charging System (OCS) for Telecom & ISP environments -Copyright (C) ITsysCOM GmbH - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -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 servmanager - -import ( - "errors" - - "github.com/cgrates/cgrates/utils" -) - -func NewSchedulerS(srvMngr *ServiceManager) *SchedulerS { - return &SchedulerS{srvMngr: srvMngr} -} - -type SchedulerS struct { - srvMngr *ServiceManager // access scheduler from servmanager so we can dynamically start/stop -} - -// Call gives the ability of SchedulerS to be passed as internal RPC -func (schdS *SchedulerS) Call(serviceMethod string, args interface{}, reply interface{}) error { - return utils.RPCCall(schdS, serviceMethod, args, reply) -} - -// V1ReloadScheduler reloads the scheduler tasks -func (schdS *SchedulerS) V1Reload(_ *utils.CGREventWithArgDispatcher, reply *string) (err error) { - sched := schdS.srvMngr.GetScheduler() - if sched == nil { - return errors.New(utils.SchedulerNotRunningCaps) - } - sched.Reload() - *reply = utils.OK - return nil -} diff --git a/servmanager/servmanager.go b/servmanager/servmanager.go index a208662e8..f550199bb 100644 --- a/servmanager/servmanager.go +++ b/servmanager/servmanager.go @@ -27,7 +27,6 @@ import ( "github.com/cgrates/cgrates/config" "github.com/cgrates/cgrates/engine" - "github.com/cgrates/cgrates/scheduler" "github.com/cgrates/cgrates/utils" "github.com/cgrates/rpcclient" ) @@ -61,7 +60,6 @@ type ServiceManager struct { dm *engine.DataManager engineShutdown chan bool cacheS *engine.CacheS - sched *scheduler.Scheduler cdrStorage engine.CdrStorage loadStorage engine.LoadStorage @@ -72,62 +70,6 @@ type ServiceManager struct { dispatcherSChan chan rpcclient.RpcClientConnection } -func (srvMngr *ServiceManager) StartScheduler(waitCache bool) error { - srvMngr.RLock() - schedRunning := srvMngr.sched != nil - srvMngr.RUnlock() - if schedRunning { - return utils.NewCGRError(utils.ServiceManager, - utils.CapitalizedMessage(utils.ServiceAlreadyRunning), - utils.ServiceAlreadyRunning, - "the scheduler is already running") - } - if waitCache { // Wait for cache to load data before starting - <-srvMngr.cacheS.GetPrecacheChannel(utils.CacheActionPlans) // wait for ActionPlans to be cached - } - utils.Logger.Info(" Starting CGRateS Scheduler.") - sched := scheduler.NewScheduler(srvMngr.dm) - srvMngr.Lock() - srvMngr.sched = sched - srvMngr.Unlock() - go func() { - sched.Loop() - srvMngr.Lock() - srvMngr.sched = nil // if we are after loop, the service is down - srvMngr.Unlock() - if srvMngr.cfg.SchedulerCfg().Enabled { - srvMngr.engineShutdown <- true // shutdown engine since this service should be running - } - }() - return nil -} - -func (srvMngr *ServiceManager) StopScheduler() error { - var sched *scheduler.Scheduler - srvMngr.Lock() - if srvMngr.sched != nil { - sched = srvMngr.sched - srvMngr.sched = nil // optimize the lock and release here - } - srvMngr.Unlock() - if sched == nil { - return utils.NewCGRError(utils.ServiceManager, - utils.CapitalizedMessage(utils.ServiceNotRunning), - utils.ServiceNotRunning, - "the scheduler is not running") - } - utils.Logger.Info(" Stoping CGRateS Scheduler.") - srvMngr.cfg.SchedulerCfg().Enabled = false - sched.Shutdown() - return nil -} - -func (srvMngr *ServiceManager) GetScheduler() *scheduler.Scheduler { - srvMngr.RLock() - defer srvMngr.RUnlock() - return srvMngr.sched -} - func (srvMngr *ServiceManager) Call(serviceMethod string, args interface{}, reply interface{}) error { parts := strings.Split(serviceMethod, ".") if len(parts) != 2 { @@ -162,8 +104,6 @@ type ArgStartService struct { // ShutdownService shuts-down a service with ID func (srvMngr *ServiceManager) V1StartService(args ArgStartService, reply *string) (err error) { switch args.ServiceID { - case utils.MetaScheduler: - err = srvMngr.StartScheduler(false) default: err = errors.New(utils.UnsupportedServiceIDCaps) } @@ -177,8 +117,6 @@ func (srvMngr *ServiceManager) V1StartService(args ArgStartService, reply *strin // ShutdownService shuts-down a service with ID func (srvMngr *ServiceManager) V1StopService(args ArgStartService, reply *string) (err error) { switch args.ServiceID { - case utils.MetaScheduler: - err = srvMngr.StopScheduler() default: err = errors.New(utils.UnsupportedServiceIDCaps) } @@ -195,8 +133,6 @@ func (srvMngr *ServiceManager) V1ServiceStatus(args ArgStartService, reply *stri defer srvMngr.RUnlock() var running bool switch args.ServiceID { - case utils.MetaScheduler: - running = srvMngr.sched != nil default: return errors.New(utils.UnsupportedServiceIDCaps) } @@ -269,6 +205,8 @@ func (srvMngr *ServiceManager) GetConnection(subsystem string, conns []*config.R if len(conns) == 0 { return nil, nil } + // srvMngr.RLock() + // defer srvMngr.RUnlock() internalChan := srvMngr.subsystems[subsystem].GetIntenternalChan() if srvMngr.GetConfig().DispatcherSCfg().Enabled { internalChan = srvMngr.dispatcherSChan @@ -350,6 +288,18 @@ func (srvMngr *ServiceManager) StartServices() (err error) { } }() } + fmt.Println(srvMngr.cfg.SchedulerCfg().Enabled) + if srvMngr.cfg.SchedulerCfg().Enabled { + go func() { + if supS, has := srvMngr.subsystems[utils.SchedulerS]; !has { + utils.Logger.Err(fmt.Sprintf("<%s> Failed to start <%s>", utils.ServiceManager, utils.SchedulerS)) + srvMngr.engineShutdown <- true + } else if err = supS.Start(srvMngr, true); err != nil { + utils.Logger.Err(fmt.Sprintf("<%s> Failed to start %s because: %s", utils.ServiceManager, utils.SchedulerS, err)) + srvMngr.engineShutdown <- true + } + }() + } // startServer() return } @@ -431,6 +381,16 @@ func (srvMngr *ServiceManager) handleReload() { if err = srvMngr.reloadService(srv, srvMngr.cfg.SupplierSCfg().Enabled); err != nil { return } + case <-srvMngr.cfg.GetReloadChan(config.SCHEDULER_JSN): + srv, has := srvMngr.subsystems[utils.SchedulerS] + if !has { + utils.Logger.Err(fmt.Sprintf("<%s> Failed to start <%s>", utils.ServiceManager, utils.SchedulerS)) + srvMngr.engineShutdown <- true + return // stop if we encounter an error + } + if err = srvMngr.reloadService(srv, srvMngr.cfg.SchedulerCfg().Enabled); err != nil { + return + } } // handle RPC server }