diff --git a/config/attributescfg.go b/config/attributescfg.go index 019c02552..e06339a5f 100644 --- a/config/attributescfg.go +++ b/config/attributescfg.go @@ -64,12 +64,25 @@ func (alS *AttributeSCfg) loadFromJsonCfg(jsnCfg *AttributeSJsonCfg) (err error) } func (alS *AttributeSCfg) AsMapInterface() map[string]interface{} { - + stringIndexedFields := []string{} + if alS.StringIndexedFields != nil { + stringIndexedFields = make([]string, len(*alS.StringIndexedFields)) + for i, item := range *alS.StringIndexedFields { + stringIndexedFields[i] = item + } + } + prefixIndexedFields := []string{} + if alS.PrefixIndexedFields != nil { + prefixIndexedFields = make([]string, len(*alS.PrefixIndexedFields)) + for i, item := range *alS.PrefixIndexedFields { + prefixIndexedFields[i] = item + } + } return map[string]interface{}{ utils.EnabledCfg: alS.Enabled, utils.IndexedSelectsCfg: alS.IndexedSelects, - utils.StringIndexedFieldsCfg: alS.StringIndexedFields, - utils.PrefixIndexedFieldsCfg: alS.PrefixIndexedFields, + utils.StringIndexedFieldsCfg: stringIndexedFields, + utils.PrefixIndexedFieldsCfg: prefixIndexedFields, utils.ProcessRunsCfg: alS.ProcessRuns, utils.NestedFieldsCfg: alS.NestedFields, } diff --git a/config/attributescfg_test.go b/config/attributescfg_test.go index f4137d773..9ac471fd3 100644 --- a/config/attributescfg_test.go +++ b/config/attributescfg_test.go @@ -20,6 +20,8 @@ package config import ( "reflect" "testing" + + "github.com/cgrates/cgrates/utils" ) func TestAttributeSCfgloadFromJsonCfg(t *testing.T) { @@ -57,3 +59,31 @@ func TestAttributeSCfgloadFromJsonCfg(t *testing.T) { t.Errorf("Expected: %+v , recived: %+v", expected, attscfg) } } + +func TestAttributeSCfgAsMapInterface(t *testing.T) { + var attscfg AttributeSCfg + cfgJSONStr := `{ +"attributes": { + "enabled": true, + "prefix_indexed_fields": ["index1","index2"], + "process_runs": 3, + }, +}` + eMap := map[string]interface{}{ + "enabled": true, + "prefix_indexed_fields": []string{"index1", "index2"}, + "process_runs": 3, + "indexed_selects": false, + "nested_fields": false, + "string_indexed_fields": []string{}, + } + if jsnCfg, err := NewCgrJsonCfgFromBytes([]byte(cfgJSONStr)); err != nil { + t.Error(err) + } else if jsnAttSCfg, err := jsnCfg.AttributeServJsonCfg(); err != nil { + t.Error(err) + } else if err = attscfg.loadFromJsonCfg(jsnAttSCfg); err != nil { + t.Error(err) + } else if rcv := attscfg.AsMapInterface(); !reflect.DeepEqual(eMap, rcv) { + t.Errorf("\nExpected: %+v\nRecived: %+v", utils.ToJSON(eMap), utils.ToJSON(rcv)) + } +} diff --git a/config/cdrscfg.go b/config/cdrscfg.go index e84542c3e..e48c10215 100644 --- a/config/cdrscfg.go +++ b/config/cdrscfg.go @@ -19,6 +19,8 @@ along with this program. If not, see package config import ( + "strings" + "github.com/cgrates/cgrates/utils" ) @@ -135,17 +137,80 @@ func (cdrscfg *CdrsCfg) AsMapInterface() map[string]interface{} { for i, item := range cdrscfg.ExtraFields { extraFields[i] = item.Rules } + onlineCDRExports := make([]string, len(cdrscfg.OnlineCDRExports)) + for i, item := range cdrscfg.OnlineCDRExports { + onlineCDRExports[i] = item + } + + chargerSConns := make([]string, len(cdrscfg.ChargerSConns)) + for i, item := range cdrscfg.ChargerSConns { + buf := utils.ConcatenatedKey(utils.MetaInternal, utils.MetaChargers) + if item == buf { + chargerSConns[i] = strings.ReplaceAll(item, utils.CONCATENATED_KEY_SEP+utils.MetaChargers, utils.EmptyString) + } else { + chargerSConns[i] = item + } + } + RALsConns := make([]string, len(cdrscfg.RaterConns)) + for i, item := range cdrscfg.RaterConns { + buf := utils.ConcatenatedKey(utils.MetaInternal, utils.MetaResponder) + + if item == buf { + RALsConns[i] = strings.ReplaceAll(item, utils.CONCATENATED_KEY_SEP+utils.MetaResponder, utils.EmptyString) + } else { + RALsConns[i] = item + } + } + + attributeSConns := make([]string, len(cdrscfg.AttributeSConns)) + for i, item := range cdrscfg.AttributeSConns { + buf := utils.ConcatenatedKey(utils.MetaInternal, utils.MetaAttributes) + if item == buf { + attributeSConns[i] = strings.ReplaceAll(item, utils.CONCATENATED_KEY_SEP+utils.MetaAttributes, utils.EmptyString) + } else { + attributeSConns[i] = item + } + } + + thresholdSConns := make([]string, len(cdrscfg.ThresholdSConns)) + for i, item := range cdrscfg.ThresholdSConns { + buf := utils.ConcatenatedKey(utils.MetaInternal, utils.MetaThresholds) + if item == buf { + thresholdSConns[i] = strings.ReplaceAll(item, utils.CONCATENATED_KEY_SEP+utils.MetaThresholds, utils.EmptyString) + } else { + thresholdSConns[i] = item + } + } + statSConns := make([]string, len(cdrscfg.StatSConns)) + for i, item := range cdrscfg.StatSConns { + buf := utils.ConcatenatedKey(utils.MetaInternal, utils.MetaStatS) + if item == buf { + statSConns[i] = strings.ReplaceAll(item, utils.CONCATENATED_KEY_SEP+utils.MetaStatS, utils.EmptyString) + } else { + statSConns[i] = item + } + } + schedulerConns := make([]string, len(cdrscfg.SchedulerConns)) + for i, item := range cdrscfg.SchedulerConns { + buf := utils.ConcatenatedKey(utils.MetaInternal, utils.MetaScheduler) + if item == buf { + schedulerConns[i] = strings.ReplaceAll(item, utils.CONCATENATED_KEY_SEP+utils.MetaScheduler, utils.EmptyString) + } else { + schedulerConns[i] = item + } + } return map[string]interface{}{ utils.EnabledCfg: cdrscfg.Enabled, utils.ExtraFieldsCfg: extraFields, utils.StoreCdrsCfg: cdrscfg.StoreCdrs, utils.SMCostRetriesCfg: cdrscfg.SMCostRetries, - utils.ChargerSConnsCfg: cdrscfg.ChargerSConns, - utils.RALsConnsCfg: cdrscfg.RaterConns, - utils.AttributeSConnsCfg: cdrscfg.AttributeSConns, - utils.ThresholdSConnsCfg: cdrscfg.ThresholdSConns, - utils.StatSConnsCfg: cdrscfg.StatSConns, - utils.OnlineCDRExportsCfg: cdrscfg.OnlineCDRExports, + utils.ChargerSConnsCfg: chargerSConns, + utils.RALsConnsCfg: RALsConns, + utils.AttributeSConnsCfg: attributeSConns, + utils.ThresholdSConnsCfg: thresholdSConns, + utils.StatSConnsCfg: statSConns, + utils.OnlineCDRExportsCfg: onlineCDRExports, + utils.SchedulerConnsCfg: schedulerConns, } } diff --git a/config/cdrscfg_test.go b/config/cdrscfg_test.go index 30a573cba..ea7e176f7 100644 --- a/config/cdrscfg_test.go +++ b/config/cdrscfg_test.go @@ -92,3 +92,82 @@ func TestExtraFieldsinAsMapInterface(t *testing.T) { t.Errorf("Expecting: '%+v', received: '%+v' ", expectedExtra, rcv[utils.ExtraFieldsCfg]) } } + +func TestCdrsCfgAsMapInterface(t *testing.T) { + var cdrscfg CdrsCfg + cfgJSONStr := `{ + "cdrs": { + "enabled": false, + "extra_fields": [], + "store_cdrs": true, + "session_cost_retries": 5, + "chargers_conns":["*localhost"], + "rals_conns": ["*internal"], + "attributes_conns": [], + "thresholds_conns": [], + "stats_conns": [], + "online_cdr_exports":[], + "scheduler_conns": [], + }, +}` + eMap := map[string]interface{}{ + "enabled": false, + "extra_fields": []string{}, + "store_cdrs": true, + "session_cost_retries": 5, + "chargers_conns": []string{"*localhost"}, + "rals_conns": []string{"*internal"}, + "attributes_conns": []string{}, + "thresholds_conns": []string{}, + "stats_conns": []string{}, + "online_cdr_exports": []string{}, + "scheduler_conns": []string{}, + } + if jsnCfg, err := NewCgrJsonCfgFromBytes([]byte(cfgJSONStr)); err != nil { + t.Error(err) + } else if jsnCdrsCfg, err := jsnCfg.CdrsJsonCfg(); err != nil { + t.Error(err) + } else if err = cdrscfg.loadFromJsonCfg(jsnCdrsCfg); err != nil { + t.Error(err) + } else if rcv := cdrscfg.AsMapInterface(); !reflect.DeepEqual(eMap, rcv) { + t.Errorf("\nExpected: %+v\nRecived: %+v", utils.ToJSON(eMap), utils.ToJSON(rcv)) + } + + cfgJSONStr = `{ + "cdrs": { + "enabled": true, + "extra_fields": ["PayPalAccount", "LCRProfile", "ResourceID"], + "store_cdrs": true, + "session_cost_retries": 9, + "chargers_conns":["*internal"], + "rals_conns": ["*internal"], + "attributes_conns": ["*internal"], + "thresholds_conns": ["*internal"], + "stats_conns": ["*internal"], + "online_cdr_exports":["http_localhost", "amqp_localhost", "http_test_file", "amqp_test_file","aws_test_file","sqs_test_file","kafka_localhost","s3_test_file"], + "scheduler_conns": ["*internal"], + }, + }` + eMap = map[string]interface{}{ + "enabled": true, + "extra_fields": []string{"PayPalAccount", "LCRProfile", "ResourceID"}, + "store_cdrs": true, + "session_cost_retries": 9, + "chargers_conns": []string{"*internal"}, + "rals_conns": []string{"*internal"}, + "attributes_conns": []string{"*internal"}, + "thresholds_conns": []string{"*internal"}, + "stats_conns": []string{"*internal"}, + "online_cdr_exports": []string{"http_localhost", "amqp_localhost", "http_test_file", "amqp_test_file", "aws_test_file", "sqs_test_file", "kafka_localhost", "s3_test_file"}, + "scheduler_conns": []string{"*internal"}, + } + if jsnCfg, err := NewCgrJsonCfgFromBytes([]byte(cfgJSONStr)); err != nil { + t.Error(err) + } else if jsnCdrsCfg, err := jsnCfg.CdrsJsonCfg(); err != nil { + t.Error(err) + } else if err = cdrscfg.loadFromJsonCfg(jsnCdrsCfg); err != nil { + t.Error(err) + } else if rcv := cdrscfg.AsMapInterface(); !reflect.DeepEqual(eMap, rcv) { + t.Errorf("\nExpected: %+v\nRecived: %+v", utils.ToJSON(eMap), utils.ToJSON(rcv)) + } +} diff --git a/config/chargerscfg.go b/config/chargerscfg.go index 41146671c..fe55749cd 100644 --- a/config/chargerscfg.go +++ b/config/chargerscfg.go @@ -18,7 +18,11 @@ along with this program. If not, see package config -import "github.com/cgrates/cgrates/utils" +import ( + "strings" + + "github.com/cgrates/cgrates/utils" +) // SupplierSCfg is the configuration of supplier service type ChargerSCfg struct { @@ -72,12 +76,35 @@ func (cS *ChargerSCfg) loadFromJsonCfg(jsnCfg *ChargerSJsonCfg) (err error) { } func (cS *ChargerSCfg) AsMapInterface() map[string]interface{} { + attributeSConns := make([]string, len(cS.AttributeSConns)) + for i, item := range cS.AttributeSConns { + buf := utils.ConcatenatedKey(utils.MetaInternal, utils.MetaAttributes) + if item == buf { + attributeSConns[i] = strings.ReplaceAll(item, utils.CONCATENATED_KEY_SEP+utils.MetaAttributes, utils.EmptyString) + } else { + attributeSConns[i] = item + } + } + stringIndexedFields := []string{} + if cS.StringIndexedFields != nil { + stringIndexedFields = make([]string, len(*cS.StringIndexedFields)) + for i, item := range *cS.StringIndexedFields { + stringIndexedFields[i] = item + } + } + prefixIndexedFields := []string{} + if cS.PrefixIndexedFields != nil { + prefixIndexedFields = make([]string, len(*cS.PrefixIndexedFields)) + for i, item := range *cS.PrefixIndexedFields { + prefixIndexedFields[i] = item + } + } return map[string]interface{}{ utils.EnabledCfg: cS.Enabled, utils.IndexedSelectsCfg: cS.IndexedSelects, - utils.AttributeSConnsCfg: cS.AttributeSConns, - utils.StringIndexedFieldsCfg: cS.StringIndexedFields, - utils.PrefixIndexedFieldsCfg: cS.PrefixIndexedFields, + utils.AttributeSConnsCfg: attributeSConns, + utils.StringIndexedFieldsCfg: stringIndexedFields, + utils.PrefixIndexedFieldsCfg: prefixIndexedFields, utils.NestedFieldsCfg: cS.NestedFields, } } diff --git a/config/chargerscfg_test.go b/config/chargerscfg_test.go index 4d24d5936..ff9447e0e 100644 --- a/config/chargerscfg_test.go +++ b/config/chargerscfg_test.go @@ -20,6 +20,8 @@ package config import ( "reflect" "testing" + + "github.com/cgrates/cgrates/utils" ) func TestChargerSCfgloadFromJsonCfg(t *testing.T) { @@ -57,3 +59,60 @@ func TestChargerSCfgloadFromJsonCfg(t *testing.T) { t.Errorf("Expected: %+v , recived: %+v", expected, chgscfg) } } + +func TestChargerSCfgAsMapInterface(t *testing.T) { + var chgscfg ChargerSCfg + cfgJSONStr := `{ + "chargers": { + "enabled": false, + "attributes_conns": [], + "indexed_selects":true, + "prefix_indexed_fields": [], + "nested_fields": false, + }, +}` + eMap := map[string]interface{}{ + "enabled": false, + "attributes_conns": []string{}, + "indexed_selects": true, + "prefix_indexed_fields": []string{}, + "nested_fields": false, + "string_indexed_fields": []string{}, + } + if jsnCfg, err := NewCgrJsonCfgFromBytes([]byte(cfgJSONStr)); err != nil { + t.Error(err) + } else if jsnChgCfg, err := jsnCfg.ChargerServJsonCfg(); err != nil { + t.Error(err) + } else if err = chgscfg.loadFromJsonCfg(jsnChgCfg); err != nil { + t.Error(err) + } else if rcv := chgscfg.AsMapInterface(); !reflect.DeepEqual(eMap, rcv) { + t.Errorf("\nExpected: %+v\nRecived: %+v", utils.ToJSON(eMap), utils.ToJSON(rcv)) + } + + cfgJSONStr = `{ + "chargers": { + "enabled": false, + "attributes_conns": ["*internal"], + "indexed_selects":true, + "prefix_indexed_fields": [], + "nested_fields": false, + }, + }` + eMap = map[string]interface{}{ + "enabled": false, + "attributes_conns": []string{"*internal"}, + "indexed_selects": true, + "prefix_indexed_fields": []string{}, + "nested_fields": false, + "string_indexed_fields": []string{}, + } + if jsnCfg, err := NewCgrJsonCfgFromBytes([]byte(cfgJSONStr)); err != nil { + t.Error(err) + } else if jsnChgCfg, err := jsnCfg.ChargerServJsonCfg(); err != nil { + t.Error(err) + } else if err = chgscfg.loadFromJsonCfg(jsnChgCfg); err != nil { + t.Error(err) + } else if rcv := chgscfg.AsMapInterface(); !reflect.DeepEqual(eMap, rcv) { + t.Errorf("\nExpected: %+v\nRecived: %+v", utils.ToJSON(eMap), utils.ToJSON(rcv)) + } +} diff --git a/config/config.go b/config/config.go index a5f97c3eb..1cc757b21 100755 --- a/config/config.go +++ b/config/config.go @@ -1482,7 +1482,7 @@ func (cfg *CGRConfig) AsMapInterface(separator string) map[string]interface{} { utils.StatsCfg: cfg.statsCfg.AsMapInterface(), utils.ThresholdSCfg: cfg.thresholdSCfg.AsMapInterface(), utils.SupplierSCfg: cfg.supplierSCfg.AsMapInterface(), - utils.SureTaxCfg: cfg.sureTaxCfg.AsMapInterface(), + utils.SureTaxCfg: cfg.sureTaxCfg.AsMapInterface(separator), utils.DispatcherSCfg: cfg.dispatcherSCfg.AsMapInterface(), utils.LoaderCgrCfg: cfg.loaderCgrCfg.AsMapInterface(), utils.MigratorCgrCfg: cfg.migratorCgrCfg.AsMapInterface(), diff --git a/config/dnsagntcfg.go b/config/dnsagntcfg.go index e1a61b94d..4f09f5fa9 100644 --- a/config/dnsagntcfg.go +++ b/config/dnsagntcfg.go @@ -165,7 +165,7 @@ func (rp *RequestProcessor) AsMapInterface(separator string) map[string]interfac for i, item := range rp.Tenant { values[i] = item.Rules } - tenant = strings.Join(values, utils.EmptyString) + tenant = strings.Join(values, separator) } flags := make(map[string][]string, len(rp.Flags)) diff --git a/config/httpcfg.go b/config/httpcfg.go index 258f0fe21..d1e1ff9d3 100644 --- a/config/httpcfg.go +++ b/config/httpcfg.go @@ -58,7 +58,7 @@ func (httpcfg *HTTPCfg) loadFromJsonCfg(jsnHttpCfg *HTTPJsonCfg) (err error) { } func (httpcfg *HTTPCfg) AsMapInterface() map[string]interface{} { - httpUsers := map[string]interface{}{} + httpUsers := make(map[string]interface{}, len(httpcfg.HTTPAuthUsers)) for key, item := range httpcfg.HTTPAuthUsers { httpUsers[key] = item } diff --git a/config/resourcescfg.go b/config/resourcescfg.go index 887ef9c91..070a94880 100644 --- a/config/resourcescfg.go +++ b/config/resourcescfg.go @@ -19,6 +19,7 @@ along with this program. If not, see package config import ( + "strings" "time" "github.com/cgrates/cgrates/utils" @@ -81,14 +82,40 @@ func (rlcfg *ResourceSConfig) loadFromJsonCfg(jsnCfg *ResourceSJsonCfg) (err err } func (rlcfg *ResourceSConfig) AsMapInterface() map[string]interface{} { - + thresholdSConns := make([]string, len(rlcfg.ThresholdSConns)) + for i, item := range rlcfg.ThresholdSConns { + buf := utils.ConcatenatedKey(utils.MetaInternal, utils.MetaThresholds) + if item == buf { + thresholdSConns[i] = strings.ReplaceAll(item, utils.CONCATENATED_KEY_SEP+utils.MetaThresholds, utils.EmptyString) + } else { + thresholdSConns[i] = item + } + } + stringIndexedFields := []string{} + if rlcfg.StringIndexedFields != nil { + stringIndexedFields = make([]string, len(*rlcfg.StringIndexedFields)) + for i, item := range *rlcfg.StringIndexedFields { + stringIndexedFields[i] = item + } + } + prefixIndexedFields := []string{} + if rlcfg.PrefixIndexedFields != nil { + prefixIndexedFields = make([]string, len(*rlcfg.PrefixIndexedFields)) + for i, item := range *rlcfg.PrefixIndexedFields { + prefixIndexedFields[i] = item + } + } + var storeInterval string = "" + if rlcfg.StoreInterval != 0 { + storeInterval = rlcfg.StoreInterval.String() + } return map[string]interface{}{ utils.EnabledCfg: rlcfg.Enabled, utils.IndexedSelectsCfg: rlcfg.IndexedSelects, - utils.ThresholdSConnsCfg: rlcfg.ThresholdSConns, - utils.StoreIntervalCfg: rlcfg.StoreInterval, - utils.StringIndexedFieldsCfg: rlcfg.StringIndexedFields, - utils.PrefixIndexedFieldsCfg: rlcfg.PrefixIndexedFields, + utils.ThresholdSConnsCfg: thresholdSConns, + utils.StoreIntervalCfg: storeInterval, + utils.StringIndexedFieldsCfg: stringIndexedFields, + utils.PrefixIndexedFieldsCfg: prefixIndexedFields, utils.NestedFieldsCfg: rlcfg.NestedFields, } diff --git a/config/resourcescfg_test.go b/config/resourcescfg_test.go index 0e6ba68ff..48f90654b 100644 --- a/config/resourcescfg_test.go +++ b/config/resourcescfg_test.go @@ -21,6 +21,8 @@ import ( "reflect" "testing" "time" + + "github.com/cgrates/cgrates/utils" ) func TestResourceSConfigloadFromJsonCfg(t *testing.T) { @@ -60,3 +62,65 @@ func TestResourceSConfigloadFromJsonCfg(t *testing.T) { t.Errorf("Expected: %+v , recived: %+v", expected, rlcfg) } } + +func TestResourceSConfigAsMapInterface(t *testing.T) { + var rlcfg ResourceSConfig + + cfgJSONStr := `{ + "resources": { + "enabled": false, + "store_interval": "", + "thresholds_conns": [], + "indexed_selects":true, + "prefix_indexed_fields": [], + "nested_fields": false, + }, +}` + eMap := map[string]interface{}{ + "enabled": false, + "store_interval": "", + "thresholds_conns": []string{}, + "indexed_selects": true, + "string_indexed_fields": []string{}, + "prefix_indexed_fields": []string{}, + "nested_fields": false, + } + if jsnCfg, err := NewCgrJsonCfgFromBytes([]byte(cfgJSONStr)); err != nil { + t.Error(err) + } else if jsnRlcCfg, err := jsnCfg.ResourceSJsonCfg(); err != nil { + t.Error(err) + } else if err = rlcfg.loadFromJsonCfg(jsnRlcCfg); err != nil { + t.Error(err) + } else if rcv := rlcfg.AsMapInterface(); !reflect.DeepEqual(eMap, rcv) { + t.Errorf("\nExpected: %+v\nRecived: %+v", utils.ToJSON(eMap), utils.ToJSON(rcv)) + } + + cfgJSONStr = `{ + "resources": { + "enabled": false, + "store_interval": "7m", + "thresholds_conns": ["*internal"], + "indexed_selects":true, + "prefix_indexed_fields": ["prefix_indexed_fields1","prefix_indexed_fields2"], + "nested_fields": false, + }, + }` + eMap = map[string]interface{}{ + "enabled": false, + "store_interval": "7m0s", + "thresholds_conns": []string{"*internal"}, + "indexed_selects": true, + "string_indexed_fields": []string{}, + "prefix_indexed_fields": []string{"prefix_indexed_fields1", "prefix_indexed_fields2"}, + "nested_fields": false, + } + if jsnCfg, err := NewCgrJsonCfgFromBytes([]byte(cfgJSONStr)); err != nil { + t.Error(err) + } else if jsnRlcCfg, err := jsnCfg.ResourceSJsonCfg(); err != nil { + t.Error(err) + } else if err = rlcfg.loadFromJsonCfg(jsnRlcCfg); err != nil { + t.Error(err) + } else if rcv := rlcfg.AsMapInterface(); !reflect.DeepEqual(eMap, rcv) { + t.Errorf("\nExpected: %+v\nRecived: %+v", utils.ToJSON(eMap), utils.ToJSON(rcv)) + } +} diff --git a/config/schedulercfg_test.go b/config/schedulercfg_test.go index 28f6de995..3e650fcdc 100644 --- a/config/schedulercfg_test.go +++ b/config/schedulercfg_test.go @@ -20,6 +20,8 @@ package config import ( "reflect" "testing" + + "github.com/cgrates/cgrates/utils" ) func TestSchedulerCfgloadFromJsonCfg(t *testing.T) { @@ -54,3 +56,28 @@ func TestSchedulerCfgloadFromJsonCfg(t *testing.T) { t.Errorf("Expected: %+v , recived: %+v", expected, schdcfg) } } + +func TestSchedulerCfgAsMapInterface(t *testing.T) { + var schdcfg SchedulerCfg + cfgJSONStr := `{ + "schedulers": { + "enabled": true, + "cdrs_conns": [], + "filters": [], + }, +}` + eMap := map[string]interface{}{ + "enabled": true, + "cdrs_conns": []string{}, + "filters": []string{}, + } + if jsnCfg, err := NewCgrJsonCfgFromBytes([]byte(cfgJSONStr)); err != nil { + t.Error(err) + } else if jsnSchCfg, err := jsnCfg.SchedulerJsonCfg(); err != nil { + t.Error(err) + } else if err = schdcfg.loadFromJsonCfg(jsnSchCfg); err != nil { + t.Error(err) + } else if rcv := schdcfg.AsMapInterface(); !reflect.DeepEqual(eMap, rcv) { + t.Errorf("\nExpected: %+v\nRecived: %+v", utils.ToJSON(eMap), utils.ToJSON(rcv)) + } +} diff --git a/config/statscfg.go b/config/statscfg.go index 8bc99fc8e..1cbe06513 100644 --- a/config/statscfg.go +++ b/config/statscfg.go @@ -19,6 +19,7 @@ along with this program. If not, see package config import ( + "strings" "time" "github.com/cgrates/cgrates/utils" @@ -85,15 +86,42 @@ func (st *StatSCfg) loadFromJsonCfg(jsnCfg *StatServJsonCfg) (err error) { } func (st *StatSCfg) AsMapInterface() map[string]interface{} { + var storeInterval string = "" + if st.StoreInterval != 0 { + storeInterval = st.StoreInterval.String() + } + stringIndexedFields := []string{} + if st.StringIndexedFields != nil { + stringIndexedFields = make([]string, len(*st.StringIndexedFields)) + for i, item := range *st.StringIndexedFields { + stringIndexedFields[i] = item + } + } + prefixIndexedFields := []string{} + if st.PrefixIndexedFields != nil { + prefixIndexedFields = make([]string, len(*st.PrefixIndexedFields)) + for i, item := range *st.PrefixIndexedFields { + prefixIndexedFields[i] = item + } + } + thresholdSConns := make([]string, len(st.ThresholdSConns)) + for i, item := range st.ThresholdSConns { + buf := utils.ConcatenatedKey(utils.MetaInternal, utils.MetaThresholds) + if item == buf { + thresholdSConns[i] = strings.ReplaceAll(item, utils.CONCATENATED_KEY_SEP+utils.MetaThresholds, utils.EmptyString) + } else { + thresholdSConns[i] = item + } + } return map[string]interface{}{ utils.EnabledCfg: st.Enabled, utils.IndexedSelectsCfg: st.IndexedSelects, - utils.StoreIntervalCfg: st.StoreInterval, + utils.StoreIntervalCfg: storeInterval, utils.StoreUncompressedLimitCfg: st.StoreUncompressedLimit, - utils.ThresholdSConnsCfg: st.ThresholdSConns, - utils.StringIndexedFieldsCfg: st.StringIndexedFields, - utils.PrefixIndexedFieldsCfg: st.PrefixIndexedFields, + utils.ThresholdSConnsCfg: thresholdSConns, + utils.StringIndexedFieldsCfg: stringIndexedFields, + utils.PrefixIndexedFieldsCfg: prefixIndexedFields, utils.NestedFieldsCfg: st.NestedFields, } diff --git a/config/statscfg_test.go b/config/statscfg_test.go index ca487c4d7..c2c56cb47 100644 --- a/config/statscfg_test.go +++ b/config/statscfg_test.go @@ -21,6 +21,8 @@ import ( "reflect" "testing" "time" + + "github.com/cgrates/cgrates/utils" ) func TestStatSCfgloadFromJsonCfg(t *testing.T) { @@ -59,3 +61,78 @@ func TestStatSCfgloadFromJsonCfg(t *testing.T) { t.Errorf("Expected: %+v , recived: %+v", expected, statscfg) } } + +func TestStatSCfgAsMapInterface(t *testing.T) { + var statscfg, expected StatSCfg + if err := statscfg.loadFromJsonCfg(nil); err != nil { + t.Error(err) + } else if !reflect.DeepEqual(statscfg, expected) { + t.Errorf("Expected: %+v ,recived: %+v", expected, statscfg) + } + if err := statscfg.loadFromJsonCfg(new(StatServJsonCfg)); err != nil { + t.Error(err) + } else if !reflect.DeepEqual(statscfg, expected) { + t.Errorf("Expected: %+v ,recived: %+v", expected, statscfg) + } + cfgJSONStr := `{ + "stats": { + "enabled": false, + "store_interval": "", + "store_uncompressed_limit": 0, + "thresholds_conns": [], + "indexed_selects":true, + "prefix_indexed_fields": [], + "nested_fields": false, + }, + }` + eMap := map[string]interface{}{ + "enabled": false, + "store_interval": "", + "store_uncompressed_limit": 0, + "thresholds_conns": []string{}, + "indexed_selects": true, + "prefix_indexed_fields": []string{}, + "nested_fields": false, + "string_indexed_fields": []string{}, + } + if jsnCfg, err := NewCgrJsonCfgFromBytes([]byte(cfgJSONStr)); err != nil { + t.Error(err) + } else if jsnStatSCfg, err := jsnCfg.StatSJsonCfg(); err != nil { + t.Error(err) + } else if err = statscfg.loadFromJsonCfg(jsnStatSCfg); err != nil { + t.Error(err) + } else if rcv := statscfg.AsMapInterface(); !reflect.DeepEqual(eMap, rcv) { + t.Errorf("\nExpected: %+v\nRecived: %+v", utils.ToJSON(eMap), utils.ToJSON(rcv)) + } + + cfgJSONStr = `{ + "stats": { + "enabled": false, + "store_interval": "72h", + "store_uncompressed_limit": 0, + "thresholds_conns": ["*internal"], + "indexed_selects":true, + "prefix_indexed_fields": ["prefix_indexed_fields1","prefix_indexed_fields2"], + "nested_fields": false, + }, + }` + eMap = map[string]interface{}{ + "enabled": false, + "store_interval": "72h0m0s", + "store_uncompressed_limit": 0, + "thresholds_conns": []string{"*internal"}, + "indexed_selects": true, + "prefix_indexed_fields": []string{"prefix_indexed_fields1", "prefix_indexed_fields2"}, + "nested_fields": false, + "string_indexed_fields": []string{}, + } + if jsnCfg, err := NewCgrJsonCfgFromBytes([]byte(cfgJSONStr)); err != nil { + t.Error(err) + } else if jsnStatSCfg, err := jsnCfg.StatSJsonCfg(); err != nil { + t.Error(err) + } else if err = statscfg.loadFromJsonCfg(jsnStatSCfg); err != nil { + t.Error(err) + } else if rcv := statscfg.AsMapInterface(); !reflect.DeepEqual(eMap, rcv) { + t.Errorf("\nExpected: %+v\nRecived: %+v", utils.ToJSON(eMap), utils.ToJSON(rcv)) + } +} diff --git a/config/supplierscfg.go b/config/supplierscfg.go index 6333060c5..f3d375ad8 100644 --- a/config/supplierscfg.go +++ b/config/supplierscfg.go @@ -18,7 +18,11 @@ along with this program. If not, see package config -import "github.com/cgrates/cgrates/utils" +import ( + "strings" + + "github.com/cgrates/cgrates/utils" +) // SupplierSCfg is the configuration of supplier service type SupplierSCfg struct { @@ -112,16 +116,67 @@ func (spl *SupplierSCfg) loadFromJsonCfg(jsnCfg *SupplierSJsonCfg) (err error) { } func (spl *SupplierSCfg) AsMapInterface() map[string]interface{} { + stringIndexedFields := []string{} + if spl.StringIndexedFields != nil { + stringIndexedFields = make([]string, len(*spl.StringIndexedFields)) + for i, item := range *spl.StringIndexedFields { + stringIndexedFields[i] = item + } + } + prefixIndexedFields := []string{} + if spl.PrefixIndexedFields != nil { + prefixIndexedFields = make([]string, len(*spl.PrefixIndexedFields)) + for i, item := range *spl.PrefixIndexedFields { + prefixIndexedFields[i] = item + } + } + attributeSConns := make([]string, len(spl.AttributeSConns)) + for i, item := range spl.AttributeSConns { + buf := utils.ConcatenatedKey(utils.MetaInternal, utils.MetaAttributes) + if item == buf { + attributeSConns[i] = strings.ReplaceAll(item, utils.CONCATENATED_KEY_SEP+utils.MetaAttributes, utils.EmptyString) + } else { + attributeSConns[i] = item + } + } + responderSConns := make([]string, len(spl.ResponderSConns)) + for i, item := range spl.ResponderSConns { + buf := utils.ConcatenatedKey(utils.MetaInternal, utils.MetaResponder) + + if item == buf { + responderSConns[i] = strings.ReplaceAll(item, utils.CONCATENATED_KEY_SEP+utils.MetaResponder, utils.EmptyString) + } else { + responderSConns[i] = item + } + } + resourceSConns := make([]string, len(spl.ResourceSConns)) + for i, item := range spl.ResourceSConns { + buf := utils.ConcatenatedKey(utils.MetaInternal, utils.MetaResources) + if item == buf { + resourceSConns[i] = strings.ReplaceAll(item, utils.CONCATENATED_KEY_SEP+utils.MetaResources, utils.EmptyString) + } else { + resourceSConns[i] = item + } + } + statSConns := make([]string, len(spl.StatSConns)) + for i, item := range spl.StatSConns { + buf := utils.ConcatenatedKey(utils.MetaInternal, utils.MetaStatS) + if item == buf { + statSConns[i] = strings.ReplaceAll(item, utils.CONCATENATED_KEY_SEP+utils.MetaStatS, utils.EmptyString) + } else { + statSConns[i] = item + } + } return map[string]interface{}{ utils.EnabledCfg: spl.Enabled, utils.IndexedSelectsCfg: spl.IndexedSelects, - utils.StringIndexedFieldsCfg: spl.StringIndexedFields, - utils.PrefixIndexedFieldsCfg: spl.PrefixIndexedFields, - utils.AttributeSConnsCfg: spl.AttributeSConns, - utils.ResourceSConnsCfg: spl.ResourceSConns, - utils.StatSConnsCfg: spl.StatSConns, - utils.RALsConnsCfg: spl.ResponderSConns, + utils.StringIndexedFieldsCfg: stringIndexedFields, + utils.PrefixIndexedFieldsCfg: prefixIndexedFields, + utils.AttributeSConnsCfg: attributeSConns, + utils.ResourceSConnsCfg: resourceSConns, + utils.StatSConnsCfg: statSConns, + utils.RALsConnsCfg: responderSConns, utils.DefaultRatioCfg: spl.DefaultRatio, utils.NestedFieldsCfg: spl.NestedFields, } diff --git a/config/supplierscfg_test.go b/config/supplierscfg_test.go index beebfd4da..0736b17ca 100644 --- a/config/supplierscfg_test.go +++ b/config/supplierscfg_test.go @@ -20,6 +20,8 @@ package config import ( "reflect" "testing" + + "github.com/cgrates/cgrates/utils" ) func TestSupplierSCfgloadFromJsonCfg(t *testing.T) { @@ -62,3 +64,76 @@ func TestSupplierSCfgloadFromJsonCfg(t *testing.T) { t.Errorf("Expected: %+v , recived: %+v", expected, supscfg) } } + +func TestSupplierSCfgAsMapInterface(t *testing.T) { + var supscfg SupplierSCfg + cfgJSONStr := `{ + "suppliers": { + "enabled": false, + "indexed_selects":true, + "prefix_indexed_fields": [], + "nested_fields": false, + "attributes_conns": [], + "resources_conns": [], + "stats_conns": [], + "rals_conns": [], + "default_ratio":1 + }, +}` + eMap := map[string]interface{}{ + "enabled": false, + "indexed_selects": true, + "prefix_indexed_fields": []string{}, + "string_indexed_fields": []string{}, + "nested_fields": false, + "attributes_conns": []string{}, + "resources_conns": []string{}, + "stats_conns": []string{}, + "rals_conns": []string{}, + "default_ratio": 1, + } + if jsnCfg, err := NewCgrJsonCfgFromBytes([]byte(cfgJSONStr)); err != nil { + t.Error(err) + } else if jsnSupSCfg, err := jsnCfg.SupplierSJsonCfg(); err != nil { + t.Error(err) + } else if err = supscfg.loadFromJsonCfg(jsnSupSCfg); err != nil { + t.Error(err) + } else if rcv := supscfg.AsMapInterface(); !reflect.DeepEqual(eMap, rcv) { + t.Errorf("\nExpected: %+v\nRecived: %+v", utils.ToJSON(eMap), utils.ToJSON(rcv)) + } + + cfgJSONStr = `{ + "suppliers": { + "enabled": false, + "indexed_selects":true, + "prefix_indexed_fields": ["prefix","indexed","fields"], + "nested_fields": false, + "attributes_conns": ["*internal"], + "resources_conns": ["*internal"], + "stats_conns": ["*internal"], + "rals_conns": ["*internal"], + "default_ratio":1 + }, + }` + eMap = map[string]interface{}{ + "enabled": false, + "indexed_selects": true, + "prefix_indexed_fields": []string{"prefix", "indexed", "fields"}, + "string_indexed_fields": []string{}, + "nested_fields": false, + "attributes_conns": []string{"*internal"}, + "resources_conns": []string{"*internal"}, + "stats_conns": []string{"*internal"}, + "rals_conns": []string{"*internal"}, + "default_ratio": 1, + } + if jsnCfg, err := NewCgrJsonCfgFromBytes([]byte(cfgJSONStr)); err != nil { + t.Error(err) + } else if jsnSupSCfg, err := jsnCfg.SupplierSJsonCfg(); err != nil { + t.Error(err) + } else if err = supscfg.loadFromJsonCfg(jsnSupSCfg); err != nil { + t.Error(err) + } else if rcv := supscfg.AsMapInterface(); !reflect.DeepEqual(eMap, rcv) { + t.Errorf("\nExpected: %+v\nRecived: %+v", utils.ToJSON(eMap), utils.ToJSON(rcv)) + } +} diff --git a/config/thresholdscfg.go b/config/thresholdscfg.go index eb75360da..39fb52c54 100644 --- a/config/thresholdscfg.go +++ b/config/thresholdscfg.go @@ -69,12 +69,30 @@ func (t *ThresholdSCfg) loadFromJsonCfg(jsnCfg *ThresholdSJsonCfg) (err error) { } func (t *ThresholdSCfg) AsMapInterface() map[string]interface{} { + var storeInterval string = "" + if t.StoreInterval != 0 { + storeInterval = t.StoreInterval.String() + } + stringIndexedFields := []string{} + if t.StringIndexedFields != nil { + stringIndexedFields = make([]string, len(*t.StringIndexedFields)) + for i, item := range *t.StringIndexedFields { + stringIndexedFields[i] = item + } + } + prefixIndexedFields := []string{} + if t.PrefixIndexedFields != nil { + prefixIndexedFields = make([]string, len(*t.PrefixIndexedFields)) + for i, item := range *t.PrefixIndexedFields { + prefixIndexedFields[i] = item + } + } return map[string]interface{}{ utils.EnabledCfg: t.Enabled, utils.IndexedSelectsCfg: t.IndexedSelects, - utils.StoreIntervalCfg: t.StoreInterval, - utils.StringIndexedFieldsCfg: t.StringIndexedFields, - utils.PrefixIndexedFieldsCfg: t.PrefixIndexedFields, + utils.StoreIntervalCfg: storeInterval, + utils.StringIndexedFieldsCfg: stringIndexedFields, + utils.PrefixIndexedFieldsCfg: prefixIndexedFields, utils.NestedFieldsCfg: t.NestedFields, } } diff --git a/config/thresholdscfg_test.go b/config/thresholdscfg_test.go index 9ae339c1f..b42984d4f 100644 --- a/config/thresholdscfg_test.go +++ b/config/thresholdscfg_test.go @@ -21,6 +21,8 @@ import ( "reflect" "testing" "time" + + "github.com/cgrates/cgrates/utils" ) func TestThresholdSCfgloadFromJsonCfg(t *testing.T) { @@ -57,3 +59,62 @@ func TestThresholdSCfgloadFromJsonCfg(t *testing.T) { t.Errorf("Expected: %+v , recived: %+v", expected, thscfg) } } + +func TestThresholdSCfgAsMapInterface(t *testing.T) { + var thscfg ThresholdSCfg + + cfgJSONStr := `{ + "thresholds": { + "enabled": false, + "store_interval": "", + "indexed_selects":true, + "prefix_indexed_fields": [], + "nested_fields": false, + }, +}` + eMap := map[string]interface{}{ + "enabled": false, + "store_interval": "", + "indexed_selects": true, + "string_indexed_fields": []string{}, + "prefix_indexed_fields": []string{}, + "nested_fields": false, + } + if jsnCfg, err := NewCgrJsonCfgFromBytes([]byte(cfgJSONStr)); err != nil { + t.Error(err) + } else if jsnThSCfg, err := jsnCfg.ThresholdSJsonCfg(); err != nil { + t.Error(err) + } else if err = thscfg.loadFromJsonCfg(jsnThSCfg); err != nil { + t.Error(err) + } else if rcv := thscfg.AsMapInterface(); !reflect.DeepEqual(eMap, rcv) { + t.Errorf("\nExpected: %+v\nRecived: %+v", utils.ToJSON(eMap), utils.ToJSON(rcv)) + } + + cfgJSONStr = `{ + "thresholds": { + "enabled": true, + "store_interval": "96h", + "indexed_selects":true, + "string_indexed_fields": ["string","indexed","fields"], + "prefix_indexed_fields": ["prefix_indexed_fields1","prefix_indexed_fields2"], + "nested_fields": true, + }, +}` + eMap = map[string]interface{}{ + "enabled": true, + "store_interval": "96h0m0s", + "indexed_selects": true, + "string_indexed_fields": []string{"string", "indexed", "fields"}, + "prefix_indexed_fields": []string{"prefix_indexed_fields1", "prefix_indexed_fields2"}, + "nested_fields": true, + } + if jsnCfg, err := NewCgrJsonCfgFromBytes([]byte(cfgJSONStr)); err != nil { + t.Error(err) + } else if jsnThSCfg, err := jsnCfg.ThresholdSJsonCfg(); err != nil { + t.Error(err) + } else if err = thscfg.loadFromJsonCfg(jsnThSCfg); err != nil { + t.Error(err) + } else if rcv := thscfg.AsMapInterface(); !reflect.DeepEqual(eMap, rcv) { + t.Errorf("\nExpected: %+v\nRecived: %+v", utils.ToJSON(eMap), utils.ToJSON(rcv)) + } +} diff --git a/utils/consts.go b/utils/consts.go index 221512684..b57478706 100755 --- a/utils/consts.go +++ b/utils/consts.go @@ -1931,8 +1931,8 @@ const ( BillToNumberCfg = "bill_to_number" ZipcodeCfg = "zipcode" Plus4Cfg = "plus4" - P2PZipcodeCfg = "p2PZipcode" - P2PPlus4Cfg = "p2PPlus4" + P2PZipcodeCfg = "p2pzipcode" + P2PPlus4Cfg = "p2pplus4" UnitsCfg = "units" UnitTypeCfg = "unit_type" TaxIncludedCfg = "tax_included"