diff --git a/config/attributescfg_test.go b/config/attributescfg_test.go
new file mode 100644
index 000000000..3207ddcfb
--- /dev/null
+++ b/config/attributescfg_test.go
@@ -0,0 +1,60 @@
+/*
+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
+
+import (
+ "reflect"
+ "strings"
+ "testing"
+)
+
+func TestAttributeSCfgloadFromJsonCfg(t *testing.T) {
+ var attscfg, expected AttributeSCfg
+ if err := attscfg.loadFromJsonCfg(nil); err != nil {
+ t.Error(err)
+ } else if !reflect.DeepEqual(attscfg, expected) {
+ t.Errorf("Expected: %+v ,recived: %+v", expected, attscfg)
+ }
+ if err := attscfg.loadFromJsonCfg(new(AttributeSJsonCfg)); err != nil {
+ t.Error(err)
+ } else if !reflect.DeepEqual(attscfg, expected) {
+ t.Errorf("Expected: %+v ,recived: %+v", expected, attscfg)
+ }
+ cfgJSONStr := `{
+"attributes": { // Attribute service
+ "enabled": true, // starts attribute service: .
+ //"string_indexed_fields": [], // query indexes based on these fields for faster processing
+ "prefix_indexed_fields": ["index1","index2"], // query indexes based on these fields for faster processing
+ "process_runs": 1, // number of run loops when processing event
+ },
+}`
+ expected = AttributeSCfg{
+ Enabled: true,
+ PrefixIndexedFields: &[]string{"index1", "index2"},
+ ProcessRuns: 1,
+ }
+ if jsnCfg, err := NewCgrJsonCfgFromReader(strings.NewReader(cfgJSONStr)); err != nil {
+ t.Error(err)
+ } else if jsnCacheCfg, err := jsnCfg.AttributeServJsonCfg(); err != nil {
+ t.Error(err)
+ } else if err = attscfg.loadFromJsonCfg(jsnCacheCfg); err != nil {
+ t.Error(err)
+ } else if !reflect.DeepEqual(expected, attscfg) {
+ t.Errorf("Expected: %+v , recived: %+v", expected, attscfg)
+ }
+}
diff --git a/config/config.go b/config/config.go
index 5eb5503c1..c7932853f 100755
--- a/config/config.go
+++ b/config/config.go
@@ -141,7 +141,6 @@ func NewDefaultCGRConfig() (*CGRConfig, error) {
cfg.ralsCfg.RALsMaxComputedUsage = make(map[string]time.Duration)
cfg.schedulerCfg = new(SchedulerCfg)
cfg.cdrsCfg = new(CdrsCfg)
- cfg.cdrStatsCfg = new(CdrStatsCfg)
cfg.CdreProfiles = make(map[string]*CdreCfg)
cfg.CdrcProfiles = make(map[string][]*CdrcCfg)
cfg.analyzerSCfg = new(AnalyzerSCfg)
@@ -151,8 +150,12 @@ func NewDefaultCGRConfig() (*CGRConfig, error) {
cfg.asteriskAgentCfg = new(AsteriskAgentCfg)
cfg.diameterAgentCfg = new(DiameterAgentCfg)
cfg.radiusAgentCfg = new(RadiusAgentCfg)
+ cfg.attributeSCfg = new(AttributeSCfg)
+ //Depricated
+ cfg.cdrStatsCfg = new(CdrStatsCfg)
cfg.SmOsipsConfig = new(SmOsipsConfig)
+
cfg.dispatcherSCfg = new(DispatcherSCfg)
cfg.ConfigReloads = make(map[string]chan struct{})
cfg.ConfigReloads[utils.CDRC] = make(chan struct{}, 1)
@@ -260,28 +263,23 @@ type CGRConfig struct {
CdrcProfiles map[string][]*CdrcCfg // Number of CDRC instances running imports, format map[dirPath][]{Configs}
loaderCfg []*LoaderSCfg // LoaderS configurations
- SmOsipsConfig *SmOsipsConfig // SMOpenSIPS Configuration
- httpAgentCfg []*HttpAgentCfg // HttpAgent configuration
- PubSubServerEnabled bool // Starts PubSub as server: .
- AliasesServerEnabled bool // Starts PubSub as server: .
- UserServerEnabled bool // Starts User as server:
- UserServerIndexes []string // List of user profile field indexes
- attributeSCfg *AttributeSCfg // Attribute service configuration
- chargerSCfg *ChargerSCfg
- resourceSCfg *ResourceSConfig // Configuration for resource limiter
- statsCfg *StatSCfg // Configuration for StatS
- thresholdSCfg *ThresholdSCfg // configuration for ThresholdS
- supplierSCfg *SupplierSCfg // configuration for SupplierS
- dispatcherSCfg *DispatcherSCfg // configuration for Dispatcher
- 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
- MailerFromAddr string // From address used when sending emails out
- DataFolderPath string // Path towards data folder, for tests internal usage, not loading out of .json options
- sureTaxCfg *SureTaxCfg // Load here SureTax configuration, as pointer so we can have runtime reloads in the future
- ConfigReloads map[string]chan struct{} // Signals to specific entities that a config reload should occur
- LoaderCgrConfig *LoaderCgrCfg
- MigratorCgrConfig *MigratorCgrCfg
+ httpAgentCfg []*HttpAgentCfg // HttpAgent configuration
+
+ chargerSCfg *ChargerSCfg
+ resourceSCfg *ResourceSConfig // Configuration for resource limiter
+ statsCfg *StatSCfg // Configuration for StatS
+ thresholdSCfg *ThresholdSCfg // configuration for ThresholdS
+ supplierSCfg *SupplierSCfg // configuration for SupplierS
+ dispatcherSCfg *DispatcherSCfg // configuration for Dispatcher
+ 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
+ MailerFromAddr string // From address used when sending emails out
+ DataFolderPath string // Path towards data folder, for tests internal usage, not loading out of .json options
+ sureTaxCfg *SureTaxCfg // Load here SureTax configuration, as pointer so we can have runtime reloads in the future
+ ConfigReloads map[string]chan struct{} // Signals to specific entities that a config reload should occur
+ LoaderCgrConfig *LoaderCgrCfg
+ MigratorCgrConfig *MigratorCgrCfg
// Cache defaults loaded from json and needing clones
dfltCdreProfile *CdreCfg // Default cdreConfig profile
@@ -298,14 +296,22 @@ type CGRConfig struct {
ralsCfg *RalsCfg // Rals config
schedulerCfg *SchedulerCfg // Scheduler config
cdrsCfg *CdrsCfg // Cdrs config
- cdrStatsCfg *CdrStatsCfg // CdrStats config - deprecated
sessionSCfg *SessionSCfg // SessionS config
fsAgentCfg *FsAgentCfg // FreeSWITCHAgent config
kamAgentCfg *KamAgentCfg // KamailioAgent config
asteriskAgentCfg *AsteriskAgentCfg // AsteriskAgent config
diameterAgentCfg *DiameterAgentCfg // DiameterAgent config
radiusAgentCfg *RadiusAgentCfg // RadiusAgent config
+ attributeSCfg *AttributeSCfg // AttributeS config
analyzerSCfg *AnalyzerSCfg
+
+ // Deprecated
+ cdrStatsCfg *CdrStatsCfg // CdrStats config
+ SmOsipsConfig *SmOsipsConfig // SMOpenSIPS Configuration
+ PubSubServerEnabled bool // Starts PubSub as server: .
+ AliasesServerEnabled bool // Starts PubSub as server: .
+ UserServerEnabled bool // Starts User as server:
+ UserServerIndexes []string // List of user profile field indexes
}
func (self *CGRConfig) checkConfigSanity() error {
@@ -797,14 +803,6 @@ func (self *CGRConfig) loadFromJsonCfg(jsnCfg *CgrJsonCfg) (err error) {
return err
}
- jsnCdrstatsCfg, err := jsnCfg.CdrStatsJsonCfg()
- if err != nil {
- return err
- }
- if err := self.cdrStatsCfg.loadFromJsonCfg(jsnCdrstatsCfg); err != nil {
- return err
- }
-
jsnCdreCfg, err := jsnCfg.CdreJsonCfgs()
if err != nil {
return err
@@ -868,25 +866,13 @@ func (self *CGRConfig) loadFromJsonCfg(jsnCfg *CgrJsonCfg) (err error) {
return err
}
- jsnPubSubServCfg, err := jsnCfg.PubSubServJsonCfg()
- if err != nil {
- return err
- }
-
- jsnAliasesServCfg, err := jsnCfg.AliasesServJsonCfg()
- if err != nil {
- return err
- }
-
- jsnUserServCfg, err := jsnCfg.UserServJsonCfg()
- if err != nil {
- return err
- }
-
jsnAttributeSCfg, err := jsnCfg.AttributeServJsonCfg()
if err != nil {
return err
}
+ if self.attributeSCfg.loadFromJsonCfg(jsnAttributeSCfg); err != nil {
+ return err
+ }
jsnChargerSCfg, err := jsnCfg.ChargerServJsonCfg()
if err != nil {
@@ -1033,26 +1019,48 @@ func (self *CGRConfig) loadFromJsonCfg(jsnCfg *CgrJsonCfg) (err error) {
}
}
+ //Depricated
+ jsnCdrstatsCfg, err := jsnCfg.CdrStatsJsonCfg()
+ if err != nil {
+ return err
+ }
+ if err := self.cdrStatsCfg.loadFromJsonCfg(jsnCdrstatsCfg); err != nil {
+ return err
+ }
+
+ jsnPubSubServCfg, err := jsnCfg.PubSubServJsonCfg()
+ if err != nil {
+ return err
+ }
if jsnPubSubServCfg != nil {
if jsnPubSubServCfg.Enabled != nil {
self.PubSubServerEnabled = *jsnPubSubServCfg.Enabled
}
}
+ jsnAliasesServCfg, err := jsnCfg.AliasesServJsonCfg()
+ if err != nil {
+ return err
+ }
if jsnAliasesServCfg != nil {
if jsnAliasesServCfg.Enabled != nil {
self.AliasesServerEnabled = *jsnAliasesServCfg.Enabled
}
}
- if jsnAttributeSCfg != nil {
- if self.attributeSCfg == nil {
- self.attributeSCfg = new(AttributeSCfg)
+ jsnUserServCfg, err := jsnCfg.UserServJsonCfg()
+ if err != nil {
+ return err
+ }
+ if jsnUserServCfg != nil {
+ if jsnUserServCfg.Enabled != nil {
+ self.UserServerEnabled = *jsnUserServCfg.Enabled
}
- if self.attributeSCfg.loadFromJsonCfg(jsnAttributeSCfg); err != nil {
- return err
+ if jsnUserServCfg.Indexes != nil {
+ self.UserServerIndexes = *jsnUserServCfg.Indexes
}
}
+ ///depricated^^^
if jsnChargerSCfg != nil {
if self.chargerSCfg == nil {
@@ -1099,15 +1107,6 @@ func (self *CGRConfig) loadFromJsonCfg(jsnCfg *CgrJsonCfg) (err error) {
}
}
- if jsnUserServCfg != nil {
- if jsnUserServCfg.Enabled != nil {
- self.UserServerEnabled = *jsnUserServCfg.Enabled
- }
- if jsnUserServCfg.Indexes != nil {
- self.UserServerIndexes = *jsnUserServCfg.Indexes
- }
- }
-
if jsnMailerCfg != nil {
if jsnMailerCfg.Server != nil {
self.MailerServer = *jsnMailerCfg.Server