diff --git a/agents/diamagent.go b/agents/diamagent.go index 6310819ba..c005934e2 100644 --- a/agents/diamagent.go +++ b/agents/diamagent.go @@ -60,7 +60,7 @@ func NewDiameterAgent(cgrCfg *config.CGRConfig, filterS *engine.FilterS, return nil, err } } - msgTemplates := da.cgrCfg.DiameterAgentCfg().Templates + msgTemplates := da.cgrCfg.TemplateCfg() // Inflate *template field types for _, procsr := range da.cgrCfg.DiameterAgentCfg().RequestProcessors { if tpls, err := config.InflateTemplates(procsr.RequestFields, msgTemplates); err != nil { @@ -185,7 +185,7 @@ func (da *DiameterAgent) handleMessage(c diam.Conn, m *diam.Message) { // build the negative error answer diamErr, err := diamErr( m, diam.UnableToComply, reqVars, - da.cgrCfg.DiameterAgentCfg().Templates[utils.MetaErr], + da.cgrCfg.TemplateCfg()[utils.MetaErr], da.cgrCfg.GeneralCfg().DefaultTenant, da.cgrCfg.GeneralCfg().DefaultTimezone, da.filterS) @@ -518,7 +518,7 @@ func (da *DiameterAgent) sendASR(originID string, reply *string) (err error) { dmd.vars, nil, nil, nil, nil, da.cgrCfg.GeneralCfg().DefaultTenant, da.cgrCfg.GeneralCfg().DefaultTimezone, da.filterS, nil, nil) - if err = aReq.SetFields(da.cgrCfg.DiameterAgentCfg().Templates[da.cgrCfg.DiameterAgentCfg().ASRTemplate]); err != nil { + if err = aReq.SetFields(da.cgrCfg.TemplateCfg()[da.cgrCfg.DiameterAgentCfg().ASRTemplate]); err != nil { utils.Logger.Warning( fmt.Sprintf("<%s> cannot disconnect session with OriginID: <%s>, err: %s", utils.DiameterAgent, originID, err.Error())) @@ -561,7 +561,7 @@ func (da *DiameterAgent) V1ReAuthorize(originID string, reply *string) (err erro dmd.vars, nil, nil, nil, nil, da.cgrCfg.GeneralCfg().DefaultTenant, da.cgrCfg.GeneralCfg().DefaultTimezone, da.filterS, nil, nil) - if err = aReq.SetFields(da.cgrCfg.DiameterAgentCfg().Templates[da.cgrCfg.DiameterAgentCfg().RARTemplate]); err != nil { + if err = aReq.SetFields(da.cgrCfg.TemplateCfg()[da.cgrCfg.DiameterAgentCfg().RARTemplate]); err != nil { utils.Logger.Warning( fmt.Sprintf("<%s> cannot send RAR with OriginID: <%s>, err: %s", utils.DiameterAgent, originID, err.Error())) diff --git a/config/config.go b/config/config.go index e2e3f8f09..25d020b7d 100755 --- a/config/config.go +++ b/config/config.go @@ -138,6 +138,7 @@ func NewDefaultCGRConfig() (cfg *CGRConfig, err error) { cfg.MaxCallDuration = time.Duration(3) * time.Hour // Hardcoded for now cfg.rpcConns = make(map[string]*RPCConn) + cfg.templates = make(map[string][]*FCTemplate) cfg.generalCfg = new(GeneralCfg) cfg.generalCfg.NodeID = utils.UUIDSha1Prefix() cfg.dataDbCfg = new(DataDbCfg) @@ -272,6 +273,8 @@ type CGRConfig struct { rpcConns map[string]*RPCConn + templates map[string][]*FCTemplate + generalCfg *GeneralCfg // General config dataDbCfg *DataDbCfg // Database config storDbCfg *StorDbCfg // StroreDb config @@ -361,7 +364,7 @@ func (cfg *CGRConfig) loadFromJsonCfg(jsnCfg *CgrJsonCfg) (err error) { // Load sections out of JSON config, stop on error for _, loadFunc := range []func(*CgrJsonCfg) error{ cfg.loadRPCConns, - cfg.loadGeneralCfg, cfg.loadCacheCfg, cfg.loadListenCfg, + cfg.loadGeneralCfg, cfg.loadTemplateSCfg, cfg.loadCacheCfg, cfg.loadListenCfg, cfg.loadHTTPCfg, cfg.loadDataDBCfg, cfg.loadStorDBCfg, cfg.loadFilterSCfg, cfg.loadRalSCfg, cfg.loadSchedulerCfg, cfg.loadCdrsCfg, cfg.loadSessionSCfg, @@ -728,7 +731,7 @@ func (cfg *CGRConfig) loadErsCfg(jsnCfg *CgrJsonCfg) (err error) { if jsnERsCfg, err = jsnCfg.ERsJsonCfg(); err != nil { return } - return cfg.ersCfg.loadFromJsonCfg(jsnERsCfg, cfg.generalCfg.RSRSep, cfg.dfltEvRdr, cfg.generalCfg.RSRSep) + return cfg.ersCfg.loadFromJsonCfg(jsnERsCfg, cfg.templates, cfg.generalCfg.RSRSep, cfg.dfltEvRdr, cfg.generalCfg.RSRSep) } // loadEesCfg loads the Ees section of the configuration @@ -737,7 +740,7 @@ func (cfg *CGRConfig) loadEesCfg(jsnCfg *CgrJsonCfg) (err error) { if jsnEEsCfg, err = jsnCfg.EEsJsonCfg(); err != nil { return } - return cfg.eesCfg.loadFromJsonCfg(jsnEEsCfg, cfg.generalCfg.RSRSep, cfg.dfltEvExp, cfg.generalCfg.RSRSep) + return cfg.eesCfg.loadFromJsonCfg(jsnEEsCfg, cfg.templates, cfg.generalCfg.RSRSep, cfg.dfltEvExp, cfg.generalCfg.RSRSep) } // loadRateSCfg loads the rates section of the configuration @@ -758,6 +761,22 @@ func (cfg *CGRConfig) loadSIPAgentCfg(jsnCfg *CgrJsonCfg) (err error) { return cfg.sipAgentCfg.loadFromJsonCfg(jsnSIPAgentCfg, cfg.generalCfg.RSRSep) } +// loadTemplateSCfg loads the Template section of the configuration +func (cfg *CGRConfig) loadTemplateSCfg(jsnCfg *CgrJsonCfg) (err error) { + var jsnTemplateCfg map[string][]*FcTemplateJsonCfg + if jsnTemplateCfg, err = jsnCfg.TemplateSJsonCfg(); err != nil { + return + } + if jsnTemplateCfg != nil { + for k, val := range jsnTemplateCfg { + if cfg.templates[k], err = FCTemplatesFromFCTemplatesJsonCfg(val, cfg.generalCfg.RSRSep); err != nil { + return + } + } + } + return +} + // SureTaxCfg use locking to retrieve the configuration, possibility later for runtime reload func (cfg *CGRConfig) SureTaxCfg() *SureTaxCfg { cfg.lks[SURETAX_JSON].Lock() @@ -1035,6 +1054,13 @@ func (cfg *CGRConfig) RPCConns() map[string]*RPCConn { return cfg.rpcConns } +// DiameterAgentCfg returns the config for Diameter Agent +func (cfg *CGRConfig) TemplateCfg() map[string][]*FCTemplate { + cfg.lks[TemplatesJson].Lock() + defer cfg.lks[TemplatesJson].Unlock() + return cfg.templates +} + // GetReloadChan returns the reload chanel for the given section func (cfg *CGRConfig) GetReloadChan(sectID string) chan struct{} { return cfg.rldChans[sectID] @@ -1127,6 +1153,8 @@ func (cfg *CGRConfig) V1GetConfigSection(args *StringWithOpts, reply *map[string jsonString = utils.ToJSON(cfg.RPCConns()) case SIPAgentJson: jsonString = utils.ToJSON(cfg.SIPAgentCfg()) + case TemplatesJson: + jsonString = utils.ToJSON(cfg.TemplateCfg()) default: return errors.New("Invalid section") } @@ -1253,6 +1281,7 @@ func (cfg *CGRConfig) getLoadFunctions() map[string]func(*CgrJsonCfg) error { RPCConnsJsonName: cfg.loadRPCConns, RateSJson: cfg.loadRateSCfg, SIPAgentJson: cfg.loadSIPAgentCfg, + TemplatesJson: cfg.loadTemplateSCfg, } } diff --git a/config/config_defaults.go b/config/config_defaults.go index 24f57fbc1..5028dff66 100755 --- a/config/config_defaults.go +++ b/config/config_defaults.go @@ -325,7 +325,6 @@ const CGRATES_CFG_JSON = ` "ers": { // EventReaderService "enabled": false, // starts the EventReader service: - "templates":{}, // default templates for ERs "sessions_conns":["*internal"], // RPC Connections IDs "readers": [ { @@ -368,7 +367,6 @@ const CGRATES_CFG_JSON = ` "cache": { "*file_csv": {"limit": -1, "ttl": "5s", "static_ttl": false}, }, - "templates":{}, // default templates for EEs "exporters": [ { "id": "*default", // identifier of the EventReader profile @@ -497,62 +495,6 @@ const CGRATES_CFG_JSON = ` "asr_template": "", // enable AbortSession message being sent to client on DisconnectSession "rar_template": "", // template used to build the Re-Auth-Request "forced_disconnect": "*none", // the request to send to diameter on DisconnectSession <*none|*asr|*rar> - "templates":{ // default message templates - "*err": [ - {"tag": "SessionId", "path": "*rep.Session-Id", "type": "*variable", - "value": "~*req.Session-Id", "mandatory": true}, - {"tag": "OriginHost", "path": "*rep.Origin-Host", "type": "*variable", - "value": "~*vars.OriginHost", "mandatory": true}, - {"tag": "OriginRealm", "path": "*rep.Origin-Realm", "type": "*variable", - "value": "~*vars.OriginRealm", "mandatory": true}, - ], - "*cca": [ - {"tag": "SessionId", "path": "*rep.Session-Id", "type": "*variable", - "value": "~*req.Session-Id", "mandatory": true}, - {"tag": "ResultCode", "path": "*rep.Result-Code", "type": "*constant", - "value": "2001"}, - {"tag": "OriginHost", "path": "*rep.Origin-Host", "type": "*variable", - "value": "~*vars.OriginHost", "mandatory": true}, - {"tag": "OriginRealm", "path": "*rep.Origin-Realm", "type": "*variable", - "value": "~*vars.OriginRealm", "mandatory": true}, - {"tag": "AuthApplicationId", "path": "*rep.Auth-Application-Id", "type": "*variable", - "value": "~*vars.*appid", "mandatory": true}, - {"tag": "CCRequestType", "path": "*rep.CC-Request-Type", "type": "*variable", - "value": "~*req.CC-Request-Type", "mandatory": true}, - {"tag": "CCRequestNumber", "path": "*rep.CC-Request-Number", "type": "*variable", - "value": "~*req.CC-Request-Number", "mandatory": true}, - ], - "*asr": [ - {"tag": "SessionId", "path": "*diamreq.Session-Id", "type": "*variable", - "value": "~*req.Session-Id", "mandatory": true}, - {"tag": "OriginHost", "path": "*diamreq.Origin-Host", "type": "*variable", - "value": "~*req.Destination-Host", "mandatory": true}, - {"tag": "OriginRealm", "path": "*diamreq.Origin-Realm", "type": "*variable", - "value": "~*req.Destination-Realm", "mandatory": true}, - {"tag": "DestinationRealm", "path": "*diamreq.Destination-Realm", "type": "*variable", - "value": "~*req.Origin-Realm", "mandatory": true}, - {"tag": "DestinationHost", "path": "*diamreq.Destination-Host", "type": "*variable", - "value": "~*req.Origin-Host", "mandatory": true}, - {"tag": "AuthApplicationId", "path": "*diamreq.Auth-Application-Id", "type": "*variable", - "value": "~*vars.*appid", "mandatory": true}, - ], - "*rar": [ - {"tag": "SessionId", "path": "*diamreq.Session-Id", "type": "*variable", - "value": "~*req.Session-Id", "mandatory": true}, - {"tag": "OriginHost", "path": "*diamreq.Origin-Host", "type": "*variable", - "value": "~*req.Destination-Host", "mandatory": true}, - {"tag": "OriginRealm", "path": "*diamreq.Origin-Realm", "type": "*variable", - "value": "~*req.Destination-Realm", "mandatory": true}, - {"tag": "DestinationRealm", "path": "*diamreq.Destination-Realm", "type": "*variable", - "value": "~*req.Origin-Realm", "mandatory": true}, - {"tag": "DestinationHost", "path": "*diamreq.Destination-Host", "type": "*variable", - "value": "~*req.Origin-Host", "mandatory": true}, - {"tag": "AuthApplicationId", "path": "*diamreq.Auth-Application-Id", "type": "*variable", - "value": "~*vars.*appid", "mandatory": true}, - {"tag": "ReAuthRequestType", "path": "*diamreq.Re-Auth-Request-Type", "type": "*constant", - "value": "0"}, - ] - }, "request_processors": [ // list of processors to be applied to diameter messages ], }, @@ -983,14 +925,69 @@ const CGRATES_CFG_JSON = ` "sessions_conns": ["*internal"], "timezone": "", // timezone of the events if not specified "retransmission_timer": "1s", // the duration to wait to receive an ACK before resending the reply - "templates":{ // default message templates - "*err": [ - {"tag": "Request", "path": "*rep.Request", "type": "*constant", - "value": "SIP/2.0 500 Internal Server Error", "mandatory": true}, - ], - }, "request_processors": [ // request processors to be applied to SIP messages ], }, +"templates": { + "*err": [ + {"tag": "SessionId", "path": "*rep.Session-Id", "type": "*variable", + "value": "~*req.Session-Id", "mandatory": true}, + {"tag": "OriginHost", "path": "*rep.Origin-Host", "type": "*variable", + "value": "~*vars.OriginHost", "mandatory": true}, + {"tag": "OriginRealm", "path": "*rep.Origin-Realm", "type": "*variable", + "value": "~*vars.OriginRealm", "mandatory": true}, + ], + "*cca": [ + {"tag": "SessionId", "path": "*rep.Session-Id", "type": "*variable", + "value": "~*req.Session-Id", "mandatory": true}, + {"tag": "ResultCode", "path": "*rep.Result-Code", "type": "*constant", + "value": "2001"}, + {"tag": "OriginHost", "path": "*rep.Origin-Host", "type": "*variable", + "value": "~*vars.OriginHost", "mandatory": true}, + {"tag": "OriginRealm", "path": "*rep.Origin-Realm", "type": "*variable", + "value": "~*vars.OriginRealm", "mandatory": true}, + {"tag": "AuthApplicationId", "path": "*rep.Auth-Application-Id", "type": "*variable", + "value": "~*vars.*appid", "mandatory": true}, + {"tag": "CCRequestType", "path": "*rep.CC-Request-Type", "type": "*variable", + "value": "~*req.CC-Request-Type", "mandatory": true}, + {"tag": "CCRequestNumber", "path": "*rep.CC-Request-Number", "type": "*variable", + "value": "~*req.CC-Request-Number", "mandatory": true}, + ], + "*asr": [ + {"tag": "SessionId", "path": "*diamreq.Session-Id", "type": "*variable", + "value": "~*req.Session-Id", "mandatory": true}, + {"tag": "OriginHost", "path": "*diamreq.Origin-Host", "type": "*variable", + "value": "~*req.Destination-Host", "mandatory": true}, + {"tag": "OriginRealm", "path": "*diamreq.Origin-Realm", "type": "*variable", + "value": "~*req.Destination-Realm", "mandatory": true}, + {"tag": "DestinationRealm", "path": "*diamreq.Destination-Realm", "type": "*variable", + "value": "~*req.Origin-Realm", "mandatory": true}, + {"tag": "DestinationHost", "path": "*diamreq.Destination-Host", "type": "*variable", + "value": "~*req.Origin-Host", "mandatory": true}, + {"tag": "AuthApplicationId", "path": "*diamreq.Auth-Application-Id", "type": "*variable", + "value": "~*vars.*appid", "mandatory": true}, + ], + "*rar": [ + {"tag": "SessionId", "path": "*diamreq.Session-Id", "type": "*variable", + "value": "~*req.Session-Id", "mandatory": true}, + {"tag": "OriginHost", "path": "*diamreq.Origin-Host", "type": "*variable", + "value": "~*req.Destination-Host", "mandatory": true}, + {"tag": "OriginRealm", "path": "*diamreq.Origin-Realm", "type": "*variable", + "value": "~*req.Destination-Realm", "mandatory": true}, + {"tag": "DestinationRealm", "path": "*diamreq.Destination-Realm", "type": "*variable", + "value": "~*req.Origin-Realm", "mandatory": true}, + {"tag": "DestinationHost", "path": "*diamreq.Destination-Host", "type": "*variable", + "value": "~*req.Origin-Host", "mandatory": true}, + {"tag": "AuthApplicationId", "path": "*diamreq.Auth-Application-Id", "type": "*variable", + "value": "~*vars.*appid", "mandatory": true}, + {"tag": "ReAuthRequestType", "path": "*diamreq.Re-Auth-Request-Type", "type": "*constant", + "value": "0"}, + ], + "*errSip": [ + {"tag": "Request", "path": "*rep.Request", "type": "*constant", + "value": "SIP/2.0 500 Internal Server Error", "mandatory": true}, + ], +}, + }` diff --git a/config/config_json.go b/config/config_json.go index 6fbc06b9e..59e9bac68 100644 --- a/config/config_json.go +++ b/config/config_json.go @@ -62,6 +62,7 @@ const ( RateSJson = "rates" RPCConnsJsonName = "rpc_conns" SIPAgentJson = "sip_agent" + TemplatesJson = "templates" ) var ( @@ -69,7 +70,7 @@ var ( CACHE_JSN, FilterSjsn, RALS_JSN, CDRS_JSN, ERsJson, SessionSJson, AsteriskAgentJSN, FreeSWITCHAgentJSN, KamailioAgentJSN, DA_JSN, RA_JSN, HttpAgentJson, DNSAgentJson, ATTRIBUTE_JSN, ChargerSCfgJson, RESOURCES_JSON, STATS_JSON, THRESHOLDS_JSON, RouteSJson, LoaderJson, MAILER_JSN, SURETAX_JSON, CgrLoaderCfgJson, CgrMigratorCfgJson, DispatcherSJson, - AnalyzerCfgJson, ApierS, EEsJson, RateSJson, SIPAgentJson, DispatcherHJson} + AnalyzerCfgJson, ApierS, EEsJson, RateSJson, SIPAgentJson, DispatcherHJson, TemplatesJson} ) // Loads the json config out of io.Reader, eg other sources than file, maybe over http @@ -531,3 +532,15 @@ func (self CgrJsonCfg) SIPAgentJsonCfg() (*SIPAgentJsonCfg, error) { } return sipAgnt, nil } + +func (self CgrJsonCfg) TemplateSJsonCfg() (map[string][]*FcTemplateJsonCfg, error) { + rawCfg, hasKey := self[TemplatesJson] + if !hasKey { + return nil, nil + } + cfg := make(map[string][]*FcTemplateJsonCfg) + if err := json.Unmarshal(*rawCfg, &cfg); err != nil { + return nil, err + } + return cfg, nil +} diff --git a/config/config_json_test.go b/config/config_json_test.go index 6badfed56..18b07c09b 100755 --- a/config/config_json_test.go +++ b/config/config_json_test.go @@ -761,153 +761,7 @@ func TestDiameterAgentJsonCfg(t *testing.T) { Asr_template: utils.StringPointer(""), Rar_template: utils.StringPointer(""), Forced_disconnect: utils.StringPointer(utils.META_NONE), - Templates: map[string][]*FcTemplateJsonCfg{ - utils.MetaErr: { - { - Tag: utils.StringPointer("SessionId"), - Path: utils.StringPointer(fmt.Sprintf("%s.Session-Id", utils.MetaRep)), - Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~*req.Session-Id"), - Mandatory: utils.BoolPointer(true)}, - { - Tag: utils.StringPointer("OriginHost"), - Path: utils.StringPointer(fmt.Sprintf("%s.Origin-Host", utils.MetaRep)), - Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~*vars.OriginHost"), - Mandatory: utils.BoolPointer(true)}, - { - Tag: utils.StringPointer("OriginRealm"), - Path: utils.StringPointer(fmt.Sprintf("%s.Origin-Realm", utils.MetaRep)), - Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~*vars.OriginRealm"), - Mandatory: utils.BoolPointer(true)}, - }, - utils.MetaCCA: { - { - Tag: utils.StringPointer("SessionId"), - Path: utils.StringPointer(fmt.Sprintf("%s.Session-Id", utils.MetaRep)), - Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~*req.Session-Id"), - Mandatory: utils.BoolPointer(true)}, - { - Tag: utils.StringPointer("ResultCode"), - Path: utils.StringPointer(fmt.Sprintf("%s.Result-Code", utils.MetaRep)), - Type: utils.StringPointer(utils.META_CONSTANT), - Value: utils.StringPointer("2001")}, - { - Tag: utils.StringPointer("OriginHost"), - Path: utils.StringPointer(fmt.Sprintf("%s.Origin-Host", utils.MetaRep)), - Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~*vars.OriginHost"), - Mandatory: utils.BoolPointer(true)}, - { - Tag: utils.StringPointer("OriginRealm"), - Path: utils.StringPointer(fmt.Sprintf("%s.Origin-Realm", utils.MetaRep)), - Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~*vars.OriginRealm"), - Mandatory: utils.BoolPointer(true)}, - { - Tag: utils.StringPointer("AuthApplicationId"), - Path: utils.StringPointer(fmt.Sprintf("%s.Auth-Application-Id", utils.MetaRep)), - Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~*vars.*appid"), - Mandatory: utils.BoolPointer(true)}, - { - Tag: utils.StringPointer("CCRequestType"), - Path: utils.StringPointer(fmt.Sprintf("%s.CC-Request-Type", utils.MetaRep)), - Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~*req.CC-Request-Type"), - Mandatory: utils.BoolPointer(true)}, - { - Tag: utils.StringPointer("CCRequestNumber"), - Path: utils.StringPointer(fmt.Sprintf("%s.CC-Request-Number", utils.MetaRep)), - Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~*req.CC-Request-Number"), - Mandatory: utils.BoolPointer(true)}, - }, - utils.MetaASR: { - { - Tag: utils.StringPointer("SessionId"), - Path: utils.StringPointer(fmt.Sprintf("%s.Session-Id", utils.MetaDiamreq)), - Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~*req.Session-Id"), - Mandatory: utils.BoolPointer(true)}, - { - Tag: utils.StringPointer("OriginHost"), - Path: utils.StringPointer(fmt.Sprintf("%s.Origin-Host", utils.MetaDiamreq)), - Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~*req.Destination-Host"), - Mandatory: utils.BoolPointer(true)}, - { - Tag: utils.StringPointer("OriginRealm"), - Path: utils.StringPointer(fmt.Sprintf("%s.Origin-Realm", utils.MetaDiamreq)), - Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~*req.Destination-Realm"), - Mandatory: utils.BoolPointer(true)}, - { - Tag: utils.StringPointer("DestinationRealm"), - Path: utils.StringPointer(fmt.Sprintf("%s.Destination-Realm", utils.MetaDiamreq)), - Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~*req.Origin-Realm"), - Mandatory: utils.BoolPointer(true)}, - { - Tag: utils.StringPointer("DestinationHost"), - Path: utils.StringPointer(fmt.Sprintf("%s.Destination-Host", utils.MetaDiamreq)), - Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~*req.Origin-Host"), - Mandatory: utils.BoolPointer(true)}, - { - Tag: utils.StringPointer("AuthApplicationId"), - Path: utils.StringPointer(fmt.Sprintf("%s.Auth-Application-Id", utils.MetaDiamreq)), - Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~*vars.*appid"), - Mandatory: utils.BoolPointer(true)}, - }, - utils.MetaRAR: { - { - Tag: utils.StringPointer("SessionId"), - Path: utils.StringPointer(fmt.Sprintf("%s.Session-Id", utils.MetaDiamreq)), - Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~*req.Session-Id"), - Mandatory: utils.BoolPointer(true)}, - { - Tag: utils.StringPointer("OriginHost"), - Path: utils.StringPointer(fmt.Sprintf("%s.Origin-Host", utils.MetaDiamreq)), - Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~*req.Destination-Host"), - Mandatory: utils.BoolPointer(true)}, - { - Tag: utils.StringPointer("OriginRealm"), - Path: utils.StringPointer(fmt.Sprintf("%s.Origin-Realm", utils.MetaDiamreq)), - Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~*req.Destination-Realm"), - Mandatory: utils.BoolPointer(true)}, - { - Tag: utils.StringPointer("DestinationRealm"), - Path: utils.StringPointer(fmt.Sprintf("%s.Destination-Realm", utils.MetaDiamreq)), - Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~*req.Origin-Realm"), - Mandatory: utils.BoolPointer(true)}, - { - Tag: utils.StringPointer("DestinationHost"), - Path: utils.StringPointer(fmt.Sprintf("%s.Destination-Host", utils.MetaDiamreq)), - Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~*req.Origin-Host"), - Mandatory: utils.BoolPointer(true)}, - { - Tag: utils.StringPointer("AuthApplicationId"), - Path: utils.StringPointer(fmt.Sprintf("%s.Auth-Application-Id", utils.MetaDiamreq)), - Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~*vars.*appid"), - Mandatory: utils.BoolPointer(true)}, - { - Tag: utils.StringPointer("ReAuthRequestType"), - Path: utils.StringPointer(fmt.Sprintf("%s.Re-Auth-Request-Type", utils.MetaDiamreq)), - Type: utils.StringPointer(utils.META_CONSTANT), - Value: utils.StringPointer("0")}, - }, - }, - Request_processors: &[]*ReqProcessorJsnCfg{}, + Request_processors: &[]*ReqProcessorJsnCfg{}, } if cfg, err := dfCgrJSONCfg.DiameterAgentJsonCfg(); err != nil { t.Error(err) @@ -1850,7 +1704,6 @@ func TestDfEventReaderCfg(t *testing.T) { eCfg := &ERsJsonCfg{ Enabled: utils.BoolPointer(false), Sessions_conns: &[]string{utils.MetaInternal}, - Templates: map[string][]*FcTemplateJsonCfg{}, Readers: &[]*EventReaderJsonCfg{ { Id: utils.StringPointer(utils.MetaDefault), @@ -1978,7 +1831,6 @@ func TestDfEventExporterCfg(t *testing.T) { Static_ttl: utils.BoolPointer(false), }, }, - Templates: map[string][]*FcTemplateJsonCfg{}, Exporters: &[]*EventExporterJsonCfg{ { Id: utils.StringPointer(utils.MetaDefault), @@ -2024,3 +1876,165 @@ func TestDfRateSJsonCfg(t *testing.T) { t.Error("Received: ", utils.ToJSON(cfg)) } } + +func TestDfTemplateSJsonCfg(t *testing.T) { + eCfg := map[string][]*FcTemplateJsonCfg{ + "*errSip": { + { + Tag: utils.StringPointer("Request"), + Path: utils.StringPointer(fmt.Sprintf("%s.Request", utils.MetaRep)), + Type: utils.StringPointer(utils.META_CONSTANT), + Value: utils.StringPointer("SIP/2.0 500 Internal Server Error"), + Mandatory: utils.BoolPointer(true)}, + }, + utils.MetaErr: { + { + Tag: utils.StringPointer("SessionId"), + Path: utils.StringPointer(fmt.Sprintf("%s.Session-Id", utils.MetaRep)), + Type: utils.StringPointer(utils.MetaVariable), + Value: utils.StringPointer("~*req.Session-Id"), + Mandatory: utils.BoolPointer(true)}, + { + Tag: utils.StringPointer("OriginHost"), + Path: utils.StringPointer(fmt.Sprintf("%s.Origin-Host", utils.MetaRep)), + Type: utils.StringPointer(utils.MetaVariable), + Value: utils.StringPointer("~*vars.OriginHost"), + Mandatory: utils.BoolPointer(true)}, + { + Tag: utils.StringPointer("OriginRealm"), + Path: utils.StringPointer(fmt.Sprintf("%s.Origin-Realm", utils.MetaRep)), + Type: utils.StringPointer(utils.MetaVariable), + Value: utils.StringPointer("~*vars.OriginRealm"), + Mandatory: utils.BoolPointer(true)}, + }, + utils.MetaCCA: { + { + Tag: utils.StringPointer("SessionId"), + Path: utils.StringPointer(fmt.Sprintf("%s.Session-Id", utils.MetaRep)), + Type: utils.StringPointer(utils.MetaVariable), + Value: utils.StringPointer("~*req.Session-Id"), + Mandatory: utils.BoolPointer(true)}, + { + Tag: utils.StringPointer("ResultCode"), + Path: utils.StringPointer(fmt.Sprintf("%s.Result-Code", utils.MetaRep)), + Type: utils.StringPointer(utils.META_CONSTANT), + Value: utils.StringPointer("2001")}, + { + Tag: utils.StringPointer("OriginHost"), + Path: utils.StringPointer(fmt.Sprintf("%s.Origin-Host", utils.MetaRep)), + Type: utils.StringPointer(utils.MetaVariable), + Value: utils.StringPointer("~*vars.OriginHost"), + Mandatory: utils.BoolPointer(true)}, + { + Tag: utils.StringPointer("OriginRealm"), + Path: utils.StringPointer(fmt.Sprintf("%s.Origin-Realm", utils.MetaRep)), + Type: utils.StringPointer(utils.MetaVariable), + Value: utils.StringPointer("~*vars.OriginRealm"), + Mandatory: utils.BoolPointer(true)}, + { + Tag: utils.StringPointer("AuthApplicationId"), + Path: utils.StringPointer(fmt.Sprintf("%s.Auth-Application-Id", utils.MetaRep)), + Type: utils.StringPointer(utils.MetaVariable), + Value: utils.StringPointer("~*vars.*appid"), + Mandatory: utils.BoolPointer(true)}, + { + Tag: utils.StringPointer("CCRequestType"), + Path: utils.StringPointer(fmt.Sprintf("%s.CC-Request-Type", utils.MetaRep)), + Type: utils.StringPointer(utils.MetaVariable), + Value: utils.StringPointer("~*req.CC-Request-Type"), + Mandatory: utils.BoolPointer(true)}, + { + Tag: utils.StringPointer("CCRequestNumber"), + Path: utils.StringPointer(fmt.Sprintf("%s.CC-Request-Number", utils.MetaRep)), + Type: utils.StringPointer(utils.MetaVariable), + Value: utils.StringPointer("~*req.CC-Request-Number"), + Mandatory: utils.BoolPointer(true)}, + }, + utils.MetaASR: { + { + Tag: utils.StringPointer("SessionId"), + Path: utils.StringPointer(fmt.Sprintf("%s.Session-Id", utils.MetaDiamreq)), + Type: utils.StringPointer(utils.MetaVariable), + Value: utils.StringPointer("~*req.Session-Id"), + Mandatory: utils.BoolPointer(true)}, + { + Tag: utils.StringPointer("OriginHost"), + Path: utils.StringPointer(fmt.Sprintf("%s.Origin-Host", utils.MetaDiamreq)), + Type: utils.StringPointer(utils.MetaVariable), + Value: utils.StringPointer("~*req.Destination-Host"), + Mandatory: utils.BoolPointer(true)}, + { + Tag: utils.StringPointer("OriginRealm"), + Path: utils.StringPointer(fmt.Sprintf("%s.Origin-Realm", utils.MetaDiamreq)), + Type: utils.StringPointer(utils.MetaVariable), + Value: utils.StringPointer("~*req.Destination-Realm"), + Mandatory: utils.BoolPointer(true)}, + { + Tag: utils.StringPointer("DestinationRealm"), + Path: utils.StringPointer(fmt.Sprintf("%s.Destination-Realm", utils.MetaDiamreq)), + Type: utils.StringPointer(utils.MetaVariable), + Value: utils.StringPointer("~*req.Origin-Realm"), + Mandatory: utils.BoolPointer(true)}, + { + Tag: utils.StringPointer("DestinationHost"), + Path: utils.StringPointer(fmt.Sprintf("%s.Destination-Host", utils.MetaDiamreq)), + Type: utils.StringPointer(utils.MetaVariable), + Value: utils.StringPointer("~*req.Origin-Host"), + Mandatory: utils.BoolPointer(true)}, + { + Tag: utils.StringPointer("AuthApplicationId"), + Path: utils.StringPointer(fmt.Sprintf("%s.Auth-Application-Id", utils.MetaDiamreq)), + Type: utils.StringPointer(utils.MetaVariable), + Value: utils.StringPointer("~*vars.*appid"), + Mandatory: utils.BoolPointer(true)}, + }, + utils.MetaRAR: { + { + Tag: utils.StringPointer("SessionId"), + Path: utils.StringPointer(fmt.Sprintf("%s.Session-Id", utils.MetaDiamreq)), + Type: utils.StringPointer(utils.MetaVariable), + Value: utils.StringPointer("~*req.Session-Id"), + Mandatory: utils.BoolPointer(true)}, + { + Tag: utils.StringPointer("OriginHost"), + Path: utils.StringPointer(fmt.Sprintf("%s.Origin-Host", utils.MetaDiamreq)), + Type: utils.StringPointer(utils.MetaVariable), + Value: utils.StringPointer("~*req.Destination-Host"), + Mandatory: utils.BoolPointer(true)}, + { + Tag: utils.StringPointer("OriginRealm"), + Path: utils.StringPointer(fmt.Sprintf("%s.Origin-Realm", utils.MetaDiamreq)), + Type: utils.StringPointer(utils.MetaVariable), + Value: utils.StringPointer("~*req.Destination-Realm"), + Mandatory: utils.BoolPointer(true)}, + { + Tag: utils.StringPointer("DestinationRealm"), + Path: utils.StringPointer(fmt.Sprintf("%s.Destination-Realm", utils.MetaDiamreq)), + Type: utils.StringPointer(utils.MetaVariable), + Value: utils.StringPointer("~*req.Origin-Realm"), + Mandatory: utils.BoolPointer(true)}, + { + Tag: utils.StringPointer("DestinationHost"), + Path: utils.StringPointer(fmt.Sprintf("%s.Destination-Host", utils.MetaDiamreq)), + Type: utils.StringPointer(utils.MetaVariable), + Value: utils.StringPointer("~*req.Origin-Host"), + Mandatory: utils.BoolPointer(true)}, + { + Tag: utils.StringPointer("AuthApplicationId"), + Path: utils.StringPointer(fmt.Sprintf("%s.Auth-Application-Id", utils.MetaDiamreq)), + Type: utils.StringPointer(utils.MetaVariable), + Value: utils.StringPointer("~*vars.*appid"), + Mandatory: utils.BoolPointer(true)}, + { + Tag: utils.StringPointer("ReAuthRequestType"), + Path: utils.StringPointer(fmt.Sprintf("%s.Re-Auth-Request-Type", utils.MetaDiamreq)), + Type: utils.StringPointer(utils.META_CONSTANT), + Value: utils.StringPointer("0")}, + }, + } + if cfg, err := dfCgrJSONCfg.TemplateSJsonCfg(); err != nil { + t.Error(err) + } else if !reflect.DeepEqual(eCfg, cfg) { + t.Errorf("Expected: %+v \n,received: %+v", utils.ToJSON(eCfg), utils.ToJSON(cfg)) + } +} diff --git a/config/config_test.go b/config/config_test.go index 9a99238ad..22a656f86 100755 --- a/config/config_test.go +++ b/config/config_test.go @@ -1895,7 +1895,6 @@ func TestCgrCdfEventReader(t *testing.T) { eCfg := &ERsCfg{ Enabled: false, SessionSConns: []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaSessionS)}, - Templates: map[string][]*FCTemplate{}, Readers: []*EventReaderCfg{ { ID: utils.MetaDefault, @@ -1960,7 +1959,6 @@ func TestCgrCdfEventExporter(t *testing.T) { StaticTTL: false, }, }, - Templates: map[string][]*FCTemplate{}, Exporters: []*EventExporterCfg{ { ID: utils.MetaDefault, @@ -2494,139 +2492,6 @@ func TestRpcConnsDefaults(t *testing.T) { } } -func TestCheckConfigSanity(t *testing.T) { - // Rater checks - cfg, _ := NewDefaultCGRConfig() - cfg.ralsCfg = &RalsCfg{ - Enabled: true, - StatSConns: []string{utils.MetaInternal}, - } - expected := " not enabled but requested by component." - if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { - t.Errorf("Expecting: %+q received: %+q", expected, err) - } - cfg.statsCfg.Enabled = true - cfg.ralsCfg.ThresholdSConns = []string{utils.MetaInternal} +func TestTemplateConnsDefaults(t *testing.T) { - expected = " not enabled but requested by component." - if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { - t.Errorf("Expecting: %+q received: %+q", expected, err) - } - cfg.ralsCfg = &RalsCfg{ - Enabled: false, - StatSConns: []string{}, - ThresholdSConns: []string{}, - } - // CDRServer checks - cfg.thresholdSCfg.Enabled = true - cfg.cdrsCfg = &CdrsCfg{ - Enabled: true, - ChargerSConns: []string{utils.MetaInternal}, - } - expected = " not enabled but requested by component." - if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { - t.Errorf("Expecting: %+q received: %+q", expected, err) - } - cfg.chargerSCfg.Enabled = true - cfg.cdrsCfg.RaterConns = []string{utils.MetaInternal} - - expected = " not enabled but requested by component." - if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { - t.Errorf("Expecting: %+q received: %+q", expected, err) - } - cfg.ralsCfg.Enabled = true - cfg.cdrsCfg.AttributeSConns = []string{utils.MetaInternal} - expected = " not enabled but requested by component." - if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { - t.Errorf("Expecting: %+q received: %+q", expected, err) - } - cfg.statsCfg.Enabled = false - cfg.attributeSCfg.Enabled = true - cfg.cdrsCfg.StatSConns = []string{utils.MetaInternal} - expected = " not enabled but requested by component." - if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { - t.Errorf("Expecting: %+q received: %+q", expected, err) - } - cfg.statsCfg.Enabled = true - cfg.cdrsCfg.OnlineCDRExports = []string{"stringy"} - expected = " cannot find exporter with ID: " - if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { - t.Errorf("Expecting: %+q received: %+q", expected, err) - } - cfg.thresholdSCfg.Enabled = false - cfg.cdrsCfg.OnlineCDRExports = []string{"stringx"} - cfg.cdrsCfg.ThresholdSConns = []string{utils.MetaInternal} - expected = " not enabled but requested by component." - if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { - t.Errorf("Expecting: %+q received: %+q", expected, err) - } -} - -func TestGeneralCfg(t *testing.T) { - var gencfg GeneralCfg - cfgJSONStr := `{ - "general": { - "node_id": "", - "logger":"*syslog", - "log_level": 6, - "http_skip_tls_verify": false, - "rounding_decimals": 5, - "dbdata_encoding": "*msgpack", - "tpexport_dir": "/var/spool/cgrates/tpe", - "poster_attempts": 3, - "failed_posts_dir": "/var/spool/cgrates/failed_posts", - "failed_posts_ttl": "5s", - "default_request_type": "*rated", - "default_category": "call", - "default_tenant": "cgrates.org", - "default_timezone": "Local", - "default_caching":"*reload", - "connect_attempts": 5, - "reconnects": -1, - "connect_timeout": "1s", - "reply_timeout": "2s", - "locking_timeout": "0", - "digest_separator": ",", - "digest_equal": ":", - "rsr_separator": ";", - "max_parallel_conns": 100, - }, -}` - eMap := map[string]interface{}{ - "node_id": "", - "logger": "*syslog", - "log_level": 6, - "http_skip_tls_verify": false, - "rounding_decimals": 5, - "dbdata_encoding": "*msgpack", - "tpexport_dir": "/var/spool/cgrates/tpe", - "poster_attempts": 3, - "failed_posts_dir": "/var/spool/cgrates/failed_posts", - "failed_posts_ttl": "5s", - "default_request_type": "*rated", - "default_category": "call", - "default_tenant": "cgrates.org", - "default_timezone": "Local", - "default_caching": "*reload", - "connect_attempts": 5, - "reconnects": -1, - "connect_timeout": "1s", - "reply_timeout": "2s", - "locking_timeout": "0", - "digest_separator": ",", - "digest_equal": ":", - "rsr_separator": ";", - "max_parallel_conns": 100, - utils.ConcurrentRequestsCfg: 0, - utils.ConcurrentStrategyCfg: utils.EmptyString, - } - if jsnCfg, err := NewCgrJsonCfgFromBytes([]byte(cfgJSONStr)); err != nil { - t.Error(err) - } else if jsnGenCfg, err := jsnCfg.GeneralJsonCfg(); err != nil { - t.Error(err) - } else if err = gencfg.loadFromJsonCfg(jsnGenCfg); err != nil { - t.Error(err) - } else if rcv := gencfg.AsMapInterface(); !reflect.DeepEqual(eMap, rcv) { - t.Errorf("Expected: %+v\nRecived: %+v", utils.ToJSON(eMap), utils.ToJSON(rcv)) - } } diff --git a/config/configsanity.go b/config/configsanity.go index 07afebf0e..5e8307f67 100644 --- a/config/configsanity.go +++ b/config/configsanity.go @@ -287,7 +287,7 @@ func (cfg *CGRConfig) checkConfigSanity() error { return fmt.Errorf("<%s> connection with id: <%s> not defined", utils.DiameterAgent, connID) } } - for prf, tmp := range cfg.diameterAgentCfg.Templates { + for prf, tmp := range cfg.templates { for _, field := range tmp { if field.Type != utils.META_NONE && field.Path == utils.EmptyString { return fmt.Errorf("<%s> %s for template %s at %s", utils.DiameterAgent, utils.NewErrMandatoryIeMissing(utils.Path), prf, field.Tag) diff --git a/config/configsanity_test.go b/config/configsanity_test.go index 0470eff64..b0504efa0 100644 --- a/config/configsanity_test.go +++ b/config/configsanity_test.go @@ -874,3 +874,71 @@ func TestConfigSanityFilterS(t *testing.T) { t.Errorf("Expecting: %+q received: %+q", expected, err) } } + +func TestCheckConfigSanity(t *testing.T) { + // Rater checks + cfg, _ := NewDefaultCGRConfig() + cfg.ralsCfg = &RalsCfg{ + Enabled: true, + StatSConns: []string{utils.MetaInternal}, + } + expected := " not enabled but requested by component." + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } + cfg.statsCfg.Enabled = true + cfg.ralsCfg.ThresholdSConns = []string{utils.MetaInternal} + + expected = " not enabled but requested by component." + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } + cfg.ralsCfg = &RalsCfg{ + Enabled: false, + StatSConns: []string{}, + ThresholdSConns: []string{}, + } + // CDRServer checks + cfg.thresholdSCfg.Enabled = true + cfg.cdrsCfg = &CdrsCfg{ + Enabled: true, + ChargerSConns: []string{utils.MetaInternal}, + } + expected = " not enabled but requested by component." + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } + cfg.chargerSCfg.Enabled = true + cfg.cdrsCfg.RaterConns = []string{utils.MetaInternal} + + expected = " not enabled but requested by component." + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } + cfg.ralsCfg.Enabled = true + cfg.cdrsCfg.AttributeSConns = []string{utils.MetaInternal} + expected = " not enabled but requested by component." + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } + cfg.statsCfg.Enabled = false + cfg.attributeSCfg.Enabled = true + cfg.cdrsCfg.StatSConns = []string{utils.MetaInternal} + expected = " not enabled but requested by component." + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } + cfg.statsCfg.Enabled = true + cfg.cdrsCfg.OnlineCDRExports = []string{"stringy"} + expected = " cannot find exporter with ID: " + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } + cfg.thresholdSCfg.Enabled = false + cfg.cdrsCfg.OnlineCDRExports = []string{"stringx"} + cfg.cdrsCfg.ThresholdSConns = []string{utils.MetaInternal} + expected = " not enabled but requested by component." + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expecting: %+q received: %+q", expected, err) + } +} diff --git a/config/diametercfg.go b/config/diametercfg.go index 7dfa18d8f..4b0ddfe91 100644 --- a/config/diametercfg.go +++ b/config/diametercfg.go @@ -39,7 +39,6 @@ type DiameterAgentCfg struct { ASRTemplate string RARTemplate string ForcedDisconnect string - Templates map[string][]*FCTemplate RequestProcessors []*RequestProcessor } @@ -97,16 +96,6 @@ func (da *DiameterAgentCfg) loadFromJsonCfg(jsnCfg *DiameterAgentJsonCfg, separa if jsnCfg.Forced_disconnect != nil { da.ForcedDisconnect = *jsnCfg.Forced_disconnect } - if jsnCfg.Templates != nil { - if da.Templates == nil { - da.Templates = make(map[string][]*FCTemplate) - } - for k, jsnTpls := range jsnCfg.Templates { - if da.Templates[k], err = FCTemplatesFromFCTemplatesJsonCfg(jsnTpls, separator); err != nil { - return - } - } - } if jsnCfg.Request_processors != nil { for _, reqProcJsn := range *jsnCfg.Request_processors { rp := new(RequestProcessor) @@ -130,16 +119,6 @@ func (da *DiameterAgentCfg) loadFromJsonCfg(jsnCfg *DiameterAgentJsonCfg, separa } func (ds *DiameterAgentCfg) AsMapInterface(separator string) map[string]interface{} { - templates := make(map[string][]map[string]interface{}) - for key, value := range ds.Templates { - fcTemplate := make([]map[string]interface{}, len(value)) - for i, val := range value { - fcTemplate[i] = val.AsMapInterface(separator) - - } - templates[key] = fcTemplate - } - requestProcessors := make([]map[string]interface{}, len(ds.RequestProcessors)) for i, item := range ds.RequestProcessors { requestProcessors[i] = item.AsMapInterface(separator) @@ -170,7 +149,6 @@ func (ds *DiameterAgentCfg) AsMapInterface(separator string) map[string]interfac utils.ASRTemplateCfg: ds.ASRTemplate, utils.RARTemplateCfg: ds.RARTemplate, utils.ForcedDisconnectCfg: ds.ForcedDisconnect, - utils.TemplatesCfg: templates, utils.RequestProcessorsCfg: requestProcessors, } } diff --git a/config/diametercfg_test.go b/config/diametercfg_test.go index 90f23dd4a..bd56e1b3f 100644 --- a/config/diametercfg_test.go +++ b/config/diametercfg_test.go @@ -60,7 +60,6 @@ func TestDiameterAgentCfgloadFromJsonCfg(t *testing.T) { VendorId: 0, ProductName: "CGRateS", SyncedConnReqs: true, - Templates: make(map[string][]*FCTemplate), } if jsnCfg, err := NewCgrJsonCfgFromBytes([]byte(cfgJSONStr)); err != nil { t.Error(err) @@ -105,7 +104,6 @@ func TestDiameterAgentCfgAsMapInterface(t *testing.T) { "sessions_conns": []string{"*internal"}, "synced_conn_requests": true, "vendor_id": 0, - "templates": map[string][]map[string]interface{}{}, "request_processors": []map[string]interface{}{}, } if jsnCfg, err := NewCgrJsonCfgFromBytes([]byte(cfgJSONStr)); err != nil { diff --git a/config/eescfg.go b/config/eescfg.go index ed5a83bec..7da0893b0 100644 --- a/config/eescfg.go +++ b/config/eescfg.go @@ -28,11 +28,10 @@ type EEsCfg struct { Enabled bool AttributeSConns []string Cache map[string]*CacheParamCfg - Templates map[string][]*FCTemplate Exporters []*EventExporterCfg } -func (eeS *EEsCfg) loadFromJsonCfg(jsnCfg *EEsJsonCfg, sep string, dfltExpCfg *EventExporterCfg, separator string) (err error) { +func (eeS *EEsCfg) loadFromJsonCfg(jsnCfg *EEsJsonCfg, msgTemplates map[string][]*FCTemplate, sep string, dfltExpCfg *EventExporterCfg, separator string) (err error) { if jsnCfg == nil { return } @@ -59,17 +58,7 @@ func (eeS *EEsCfg) loadFromJsonCfg(jsnCfg *EEsJsonCfg, sep string, dfltExpCfg *E } } } - if jsnCfg.Templates != nil { - if eeS.Templates == nil { - eeS.Templates = make(map[string][]*FCTemplate) - } - for k, jsnTpls := range jsnCfg.Templates { - if eeS.Templates[k], err = FCTemplatesFromFCTemplatesJsonCfg(jsnTpls, separator); err != nil { - return - } - } - } - return eeS.appendEEsExporters(jsnCfg.Exporters, eeS.Templates, sep, dfltExpCfg) + return eeS.appendEEsExporters(jsnCfg.Exporters, msgTemplates, sep, dfltExpCfg) } func (eeS *EEsCfg) appendEEsExporters(exporters *[]*EventExporterJsonCfg, msgTemplates map[string][]*FCTemplate, separator string, dfltExpCfg *EventExporterCfg) (err error) { diff --git a/config/eescfg_test.go b/config/eescfg_test.go index d8067c8d4..652957972 100644 --- a/config/eescfg_test.go +++ b/config/eescfg_test.go @@ -151,7 +151,6 @@ func TestEventExporterSameID(t *testing.T) { StaticTTL: false, }, }, - Templates: map[string][]*FCTemplate{}, Exporters: []*EventExporterCfg{ &EventExporterCfg{ ID: utils.MetaDefault, diff --git a/config/erscfg.go b/config/erscfg.go index 6ce875ee4..75f8700e4 100644 --- a/config/erscfg.go +++ b/config/erscfg.go @@ -28,11 +28,10 @@ import ( type ERsCfg struct { Enabled bool SessionSConns []string - Templates map[string][]*FCTemplate Readers []*EventReaderCfg } -func (erS *ERsCfg) loadFromJsonCfg(jsnCfg *ERsJsonCfg, sep string, dfltRdrCfg *EventReaderCfg, separator string) (err error) { +func (erS *ERsCfg) loadFromJsonCfg(jsnCfg *ERsJsonCfg, msgTemplates map[string][]*FCTemplate, sep string, dfltRdrCfg *EventReaderCfg, separator string) (err error) { if jsnCfg == nil { return } @@ -50,17 +49,7 @@ func (erS *ERsCfg) loadFromJsonCfg(jsnCfg *ERsJsonCfg, sep string, dfltRdrCfg *E } } } - if jsnCfg.Templates != nil { - if erS.Templates == nil { - erS.Templates = make(map[string][]*FCTemplate) - } - for k, jsnTpls := range jsnCfg.Templates { - if erS.Templates[k], err = FCTemplatesFromFCTemplatesJsonCfg(jsnTpls, separator); err != nil { - return - } - } - } - return erS.appendERsReaders(jsnCfg.Readers, erS.Templates, sep, dfltRdrCfg) + return erS.appendERsReaders(jsnCfg.Readers, msgTemplates, sep, dfltRdrCfg) } func (ers *ERsCfg) appendERsReaders(jsnReaders *[]*EventReaderJsonCfg, msgTemplates map[string][]*FCTemplate, sep string, diff --git a/config/erscfg_test.go b/config/erscfg_test.go index 806e4b1e3..4292464b8 100644 --- a/config/erscfg_test.go +++ b/config/erscfg_test.go @@ -103,7 +103,6 @@ func TestEventReaderLoadFromJSON(t *testing.T) { expectedERsCfg := &ERsCfg{ Enabled: true, SessionSConns: []string{"conn1", "conn3"}, - Templates: map[string][]*FCTemplate{}, Readers: []*EventReaderCfg{ { ID: utils.MetaDefault, @@ -242,7 +241,6 @@ func TestEventReaderSameID(t *testing.T) { expectedERsCfg := &ERsCfg{ Enabled: true, SessionSConns: []string{"conn1"}, - Templates: map[string][]*FCTemplate{}, Readers: []*EventReaderCfg{ { ID: utils.MetaDefault, diff --git a/config/libconfig_json.go b/config/libconfig_json.go index e52a068d4..0c9060e2c 100755 --- a/config/libconfig_json.go +++ b/config/libconfig_json.go @@ -155,7 +155,6 @@ type CdrsJsonCfg struct { type ERsJsonCfg struct { Enabled *bool Sessions_conns *[]string - Templates map[string][]*FcTemplateJsonCfg Readers *[]*EventReaderJsonCfg } @@ -187,7 +186,6 @@ type EEsJsonCfg struct { Enabled *bool Attributes_conns *[]string Cache *map[string]*CacheParamJsonCfg - Templates map[string][]*FcTemplateJsonCfg Exporters *[]*EventExporterJsonCfg } @@ -345,7 +343,6 @@ type DiameterAgentJsonCfg struct { Asr_template *string Rar_template *string Forced_disconnect *string - Templates map[string][]*FcTemplateJsonCfg Request_processors *[]*ReqProcessorJsnCfg } diff --git a/packages/debian/changelog b/packages/debian/changelog index f2cff4dd8..13ab29ee6 100644 --- a/packages/debian/changelog +++ b/packages/debian/changelog @@ -97,6 +97,7 @@ cgrates (0.11.0~dev) UNRELEASED; urgency=medium * [DispatcherH] Added DispatcherH subsystem * [ERs] Added support for *amqp_json_map type * [DataDB] Moved all specific DB options in opts + * [Config] Add new section "template" -- DanB Wed, 19 Feb 2020 13:25:52 +0200