From 391b904ecc84a21fae2bac6c2e56979740ef35be Mon Sep 17 00:00:00 2001 From: Anevo Date: Fri, 16 Mar 2018 12:00:09 -0400 Subject: [PATCH] Added Loaders to config.go --- config/config.go | 31 +++++++-- config/config_test.go | 72 +++++++++++++++++++++ config/loadersconfig.go | 137 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 234 insertions(+), 6 deletions(-) create mode 100644 config/loadersconfig.go diff --git a/config/config.go b/config/config.go index 6afe175a8..9035ed09e 100755 --- a/config/config.go +++ b/config/config.go @@ -42,12 +42,14 @@ const ( ) var ( - DBDefaults DbDefaults - cgrCfg *CGRConfig // will be shared - dfltFsConnConfig *FsConnConfig // Default FreeSWITCH Connection configuration, built out of json default configuration - dfltKamConnConfig *KamConnConfig // Default Kamailio Connection configuration - dfltHaPoolConfig *HaPoolConfig - dfltAstConnCfg *AsteriskConnCfg + DBDefaults DbDefaults + cgrCfg *CGRConfig // will be shared + dfltFsConnConfig *FsConnConfig // Default FreeSWITCH Connection configuration, built out of json default configuration + dfltKamConnConfig *KamConnConfig // Default Kamailio Connection configuration + dfltHaPoolConfig *HaPoolConfig + dfltAstConnCfg *AsteriskConnCfg + dfltLoadersConfig *LoaderSConfig + dfltLoaderSDataTypeConfig *LoaderSDataType ) func NewDbDefaults() DbDefaults { @@ -343,6 +345,7 @@ type CGRConfig struct { statsCfg *StatSCfg // Configuration for StatS thresholdSCfg *ThresholdSCfg // configuration for ThresholdS supplierSCfg *SupplierSCfg // configuration for SupplierS + LoaderProfiles []*LoaderSConfig // configuration for Loader MailerServer string // The server to use when sending emails out MailerAuthUser string // Authenticate to email server using this user MailerAuthPass string // Authenticate to email server with this password @@ -775,6 +778,11 @@ func (self *CGRConfig) loadFromJsonCfg(jsnCfg *CgrJsonCfg) (err error) { return err } + jsnLoaderSCfg, err := jsnCfg.LoaderSJsonCfg() + if err != nil { + return err + } + jsnMailerCfg, err := jsnCfg.MailerJsonCfg() if err != nil { return err @@ -1137,6 +1145,17 @@ func (self *CGRConfig) loadFromJsonCfg(jsnCfg *CgrJsonCfg) (err error) { } } } + + if jsnLoaderSCfg != nil { + if self.LoaderProfiles == nil { + self.LoaderProfiles = make([]*LoaderSConfig, len(jsnLoaderSCfg)) + } + for idx, profile := range jsnLoaderSCfg { + self.LoaderProfiles[idx] = NewDfltLoadersConfig() + self.LoaderProfiles[idx].loadFromJsonCfg(profile) + } + } + if jsnCdrcCfg != nil { if self.CdrcProfiles == nil { self.CdrcProfiles = make(map[string][]*CdrcConfig) diff --git a/config/config_test.go b/config/config_test.go index 13f4b73d1..6f57ce6cd 100755 --- a/config/config_test.go +++ b/config/config_test.go @@ -915,3 +915,75 @@ func TestDbDefaults(t *testing.T) { } } } + +func TestLoaderDefaults(t *testing.T) { + eCfg := []*LoaderSConfig{ + &LoaderSConfig{ + Id: utils.META_DEFAULT, + Enabled: false, + DryRun: false, + CacheSConns: []*HaPoolConfig{ + &HaPoolConfig{ + Address: utils.MetaInternal, + }, + }, + FieldSeparator: ",", + MaxOpenFiles: 1024, + TpInDir: "/var/spool/cgrates/tploader/in", + TpOutDir: "/var/spool/cgrates/tploader/out", + Data: []*LoaderSDataType{ + &LoaderSDataType{ + Type: utils.MetaAttributes, + Filename: utils.AttributesCsv, + Fields: []*CfgCdrField{ + &CfgCdrField{Tag: "TenantID", + FieldId: "Tenant", + Type: utils.META_COMPOSED, + Value: utils.ParseRSRFieldsMustCompile("0", utils.INFIELD_SEP), + Mandatory: true}, + &CfgCdrField{Tag: "ProfileID", + FieldId: "ID", + Type: utils.META_COMPOSED, + Value: utils.ParseRSRFieldsMustCompile("1", utils.INFIELD_SEP), + Mandatory: true}, + &CfgCdrField{Tag: "Contexts", + FieldId: "Contexts", + Type: utils.META_COMPOSED, + Value: utils.ParseRSRFieldsMustCompile("2", utils.INFIELD_SEP)}, + &CfgCdrField{Tag: "FilterIDs", + FieldId: "FilterIDs", + Type: utils.META_COMPOSED, + Value: utils.ParseRSRFieldsMustCompile("3", utils.INFIELD_SEP)}, + &CfgCdrField{Tag: "ActivationInterval", + FieldId: "ActivationInterval", + Type: utils.META_COMPOSED, + Value: utils.ParseRSRFieldsMustCompile("4", utils.INFIELD_SEP)}, + &CfgCdrField{Tag: "FieldName", + FieldId: "FieldName", + Type: utils.META_COMPOSED, + Value: utils.ParseRSRFieldsMustCompile("5", utils.INFIELD_SEP)}, + &CfgCdrField{Tag: "Initial", + FieldId: "Initial", + Type: utils.META_COMPOSED, + Value: utils.ParseRSRFieldsMustCompile("6", utils.INFIELD_SEP)}, + &CfgCdrField{Tag: "Substitute", + FieldId: "Substitute", + Type: utils.META_COMPOSED, + Value: utils.ParseRSRFieldsMustCompile("7", utils.INFIELD_SEP)}, + &CfgCdrField{Tag: "Append", + FieldId: "Append", + Type: utils.META_COMPOSED, + Value: utils.ParseRSRFieldsMustCompile("8", utils.INFIELD_SEP)}, + &CfgCdrField{Tag: "Weight", + FieldId: "Weight", + Type: utils.META_COMPOSED, + Value: utils.ParseRSRFieldsMustCompile("9", utils.INFIELD_SEP)}, + }, + }, + }, + }, + } + if !reflect.DeepEqual(eCfg, cgrCfg.LoaderProfiles) { + t.Errorf("received: %+v, expecting: %+v", eCfg, cgrCfg.LoaderProfiles) + } +} diff --git a/config/loadersconfig.go b/config/loadersconfig.go new file mode 100644 index 000000000..9a926708c --- /dev/null +++ b/config/loadersconfig.go @@ -0,0 +1,137 @@ +/* +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 config + +func NewDfltLoadersConfig() *LoaderSConfig { + if dfltLoadersConfig == nil { + return new(LoaderSConfig) + } + dfltVal := *dfltLoadersConfig + return &dfltVal +} + +type LoaderSConfig struct { + Id string + Enabled bool + DryRun bool + CacheSConns []*HaPoolConfig + FieldSeparator string + MaxOpenFiles int + TpInDir string + TpOutDir string + Data []*LoaderSDataType +} + +func NewDfltLoaderSDataTypeConfig() *LoaderSDataType { + if dfltLoaderSDataTypeConfig == nil { + return new(LoaderSDataType) // No defaults, most probably we are building the defaults now + } + dfltVal := *dfltLoaderSDataTypeConfig // Copy the value instead of it's pointer + return &dfltVal +} + +type LoaderSDataType struct { + Type string + Filename string + Fields []*CfgCdrField +} + +func (self *LoaderSDataType) loadFromJsonCfg(jsnCfg *LoaderSJsonDataType) error { + if jsnCfg == nil { + return nil + } + var err error + if jsnCfg.Type != nil { + self.Type = *jsnCfg.Type + } + if jsnCfg.File_name != nil { + self.Filename = *jsnCfg.File_name + } + if jsnCfg.Fields != nil { + if self.Fields, err = CfgCdrFieldsFromCdrFieldsJsonCfg(*jsnCfg.Fields); err != nil { + return err + } + } + return nil +} + +func (self *LoaderSConfig) loadFromJsonCfg(jsnCfg *LoaderSJsonCfg) error { + if jsnCfg == nil { + return nil + } + if jsnCfg.ID != nil { + self.Id = *jsnCfg.ID + } + if jsnCfg.Enabled != nil { + self.Enabled = *jsnCfg.Enabled + } + if jsnCfg.Dry_run != nil { + self.DryRun = *jsnCfg.Dry_run + } + if jsnCfg.Caches_conns != nil { + self.CacheSConns = make([]*HaPoolConfig, len(*jsnCfg.Caches_conns)) + for idx, jsnHaCfg := range *jsnCfg.Caches_conns { + self.CacheSConns[idx] = NewDfltHaPoolConfig() + self.CacheSConns[idx].loadFromJsonCfg(jsnHaCfg) + } + } + if jsnCfg.Field_separator != nil { + self.FieldSeparator = *jsnCfg.Field_separator + } + if jsnCfg.Max_open_files != nil { + self.MaxOpenFiles = *jsnCfg.Max_open_files + } + if jsnCfg.Tp_in_dir != nil { + self.TpInDir = *jsnCfg.Tp_in_dir + } + if jsnCfg.Tp_out_dir != nil { + self.TpOutDir = *jsnCfg.Tp_out_dir + } + if jsnCfg.Data != nil { + self.Data = make([]*LoaderSDataType, len(*jsnCfg.Data)) + for idx, jsnLoCfg := range *jsnCfg.Data { + self.Data[idx] = NewDfltLoaderSDataTypeConfig() + self.Data[idx].loadFromJsonCfg(jsnLoCfg) + } + } + return nil +} + +// Clone itself into a new LoadersConfig +func (self *LoaderSConfig) Clone() *LoaderSConfig { + clnLoader := new(LoaderSConfig) + clnLoader.Id = self.Id + clnLoader.Enabled = self.Enabled + clnLoader.DryRun = self.DryRun + clnLoader.CacheSConns = make([]*HaPoolConfig, len(self.CacheSConns)) + for idx, cdrConn := range self.CacheSConns { + clonedVal := *cdrConn + clnLoader.CacheSConns[idx] = &clonedVal + } + clnLoader.FieldSeparator = self.FieldSeparator + clnLoader.MaxOpenFiles = self.MaxOpenFiles + clnLoader.TpInDir = self.TpInDir + clnLoader.TpOutDir = self.TpOutDir + clnLoader.Data = make([]*LoaderSDataType, len(self.Data)) + for idx, fld := range self.Data { + clonedVal := *fld + clnLoader.Data[idx] = &clonedVal + } + return clnLoader +}