diff --git a/config/cdrscfg.go b/config/cdrscfg.go index 2f902ae51..141a7ae64 100644 --- a/config/cdrscfg.go +++ b/config/cdrscfg.go @@ -144,85 +144,101 @@ func (cdrscfg *CdrsCfg) loadFromJsonCfg(jsnCdrsCfg *CdrsJsonCfg) (err error) { return nil } -func (cdrscfg *CdrsCfg) AsMapInterface() map[string]interface{} { +func (cdrscfg *CdrsCfg) AsMapInterface() (initialMP map[string]interface{}) { + initialMP = map[string]interface{}{ + utils.EnabledCfg: cdrscfg.Enabled, + utils.StoreCdrsCfg: cdrscfg.StoreCdrs, + utils.SMCostRetriesCfg: cdrscfg.SMCostRetries, + } + extraFields := make([]string, len(cdrscfg.ExtraFields)) for i, item := range cdrscfg.ExtraFields { extraFields[i] = item.Rules } + initialMP[utils.ExtraFieldsCfg] = extraFields + onlineCDRExports := make([]string, len(cdrscfg.OnlineCDRExports)) for i, item := range cdrscfg.OnlineCDRExports { onlineCDRExports[i] = item } + initialMP[utils.OnlineCDRExportsCfg] = onlineCDRExports - 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 + if cdrscfg.ChargerSConns != nil { + chargerSConns := make([]string, len(cdrscfg.ChargerSConns)) + for i, item := range cdrscfg.ChargerSConns { + if item == utils.ConcatenatedKey(utils.MetaInternal, utils.MetaChargers) { + chargerSConns[i] = strings.ReplaceAll(item, utils.CONCATENATED_KEY_SEP+utils.MetaChargers, utils.EmptyString) + } else { + chargerSConns[i] = item + } } + initialMP[utils.ChargerSConnsCfg] = chargerSConns } - 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 + if cdrscfg.RaterConns != nil { + raterConns := make([]string, len(cdrscfg.RaterConns)) + for i, item := range cdrscfg.RaterConns { + if item == utils.ConcatenatedKey(utils.MetaInternal, utils.MetaResponder) { + raterConns[i] = strings.ReplaceAll(item, utils.CONCATENATED_KEY_SEP+utils.MetaResponder, utils.EmptyString) + } else { + raterConns[i] = item + } } + initialMP[utils.RALsConnsCfg] = raterConns } - - 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 + if cdrscfg.AttributeSConns != nil { + attributeSConns := make([]string, len(cdrscfg.AttributeSConns)) + for i, item := range cdrscfg.AttributeSConns { + if item == utils.ConcatenatedKey(utils.MetaInternal, utils.MetaAttributes) { + attributeSConns[i] = strings.ReplaceAll(item, utils.CONCATENATED_KEY_SEP+utils.MetaAttributes, utils.EmptyString) + } else { + attributeSConns[i] = item + } } + initialMP[utils.AttributeSConnsCfg] = attributeSConns } - - 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 + if cdrscfg.ThresholdSConns != nil { + thresholdSConns := make([]string, len(cdrscfg.ThresholdSConns)) + for i, item := range cdrscfg.ThresholdSConns { + if item == utils.ConcatenatedKey(utils.MetaInternal, utils.MetaThresholds) { + thresholdSConns[i] = strings.ReplaceAll(item, utils.CONCATENATED_KEY_SEP+utils.MetaThresholds, utils.EmptyString) + } else { + thresholdSConns[i] = item + } } + initialMP[utils.ThresholdSConnsCfg] = thresholdSConns } - 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 + if cdrscfg.StatSConns != nil { + statSConns := make([]string, len(cdrscfg.StatSConns)) + for i, item := range cdrscfg.StatSConns { + if item == utils.ConcatenatedKey(utils.MetaInternal, utils.MetaStatS) { + statSConns[i] = strings.ReplaceAll(item, utils.CONCATENATED_KEY_SEP+utils.MetaStatS, utils.EmptyString) + } else { + statSConns[i] = item + } } + initialMP[utils.StatSConnsCfg] = statSConns } - 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 + if cdrscfg.SchedulerConns != nil { + schedulerConns := make([]string, len(cdrscfg.SchedulerConns)) + for i, item := range cdrscfg.SchedulerConns { + if item == utils.ConcatenatedKey(utils.MetaInternal, utils.MetaScheduler) { + schedulerConns[i] = strings.ReplaceAll(item, utils.CONCATENATED_KEY_SEP+utils.MetaScheduler, utils.EmptyString) + } else { + schedulerConns[i] = item + } } + initialMP[utils.SchedulerConnsCfg] = schedulerConns } - - return map[string]interface{}{ - utils.EnabledCfg: cdrscfg.Enabled, - utils.ExtraFieldsCfg: extraFields, - utils.StoreCdrsCfg: cdrscfg.StoreCdrs, - utils.SMCostRetriesCfg: cdrscfg.SMCostRetries, - utils.ChargerSConnsCfg: chargerSConns, - utils.RALsConnsCfg: RALsConns, - utils.AttributeSConnsCfg: attributeSConns, - utils.ThresholdSConnsCfg: thresholdSConns, - utils.StatSConnsCfg: statSConns, - utils.OnlineCDRExportsCfg: onlineCDRExports, - utils.SchedulerConnsCfg: schedulerConns, + if cdrscfg.EEsConns != nil { + eesConns := make([]string, len(cdrscfg.EEsConns)) + for i, item := range cdrscfg.EEsConns { + if item == utils.ConcatenatedKey(utils.MetaInternal, utils.MetaEEs) { + eesConns[i] = strings.ReplaceAll(item, utils.CONCATENATED_KEY_SEP+utils.MetaEEs, utils.EmptyString) + } else { + eesConns[i] = item + } + } + initialMP[utils.EEsConnsCfg] = eesConns } + return } diff --git a/config/cdrscfg_test.go b/config/cdrscfg_test.go index ea7e176f7..079d19d16 100644 --- a/config/cdrscfg_test.go +++ b/config/cdrscfg_test.go @@ -48,6 +48,7 @@ func TestCdrsCfgloadFromJsonCfg(t *testing.T) { "thresholds_conns": [], // address where to reach the thresholds service, empty to disable thresholds functionality: <""|*internal|x.y.z.y:1234> "stats_conns": [], // address where to reach the stat service, empty to disable stats functionality: <""|*internal|x.y.z.y:1234> "online_cdr_exports":[], // list of CDRE profiles to use for real-time CDR exports + "ees_conns": [], // connections to EventExporter }, }` expected = CdrsCfg{ @@ -58,6 +59,7 @@ func TestCdrsCfgloadFromJsonCfg(t *testing.T) { AttributeSConns: []string{}, ThresholdSConns: []string{}, StatSConns: []string{}, + EEsConns: []string{}, } if jsnCfg, err := NewCgrJsonCfgFromBytes([]byte(cfgJSONStr)); err != nil { t.Error(err) @@ -71,34 +73,28 @@ func TestCdrsCfgloadFromJsonCfg(t *testing.T) { } func TestExtraFieldsinAsMapInterface(t *testing.T) { - var cdrscfg CdrsCfg cfgJSONStr := `{ "cdrs": { "enabled": true, - "extra_fields": ["PayPalAccount", "LCRProfile", "ResourceID"], + "extra_fields": ["~effective_caller_id_number:s/(\\d+)/+$1/","~Custom_Val:s/(\\d+)/+$1/"], "chargers_conns":["*localhost"], "store_cdrs": true, "online_cdr_exports": [] }, }` - expectedExtra := []string{"PayPalAccount", "LCRProfile", "ResourceID"} - if jsnCfg, err := NewCgrJsonCfgFromBytes([]byte(cfgJSONStr)); err != nil { + expectedExtra := []string{`~effective_caller_id_number:s/(\d+)/+$1/`, "~Custom_Val:s/(\\d+)/+$1/"} + if cgrCfg, err := NewCGRConfigFromJsonStringWithDefaults(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(rcv[utils.ExtraFieldsCfg], expectedExtra) { - t.Errorf("Expecting: '%+v', received: '%+v' ", expectedExtra, rcv[utils.ExtraFieldsCfg]) + } else if rcv := cgrCfg.cdrsCfg.AsMapInterface(); !reflect.DeepEqual(rcv[utils.ExtraFieldsCfg], expectedExtra) { + t.Errorf("Expected %+v \n, recieved %+v \n", expectedExtra, rcv[utils.ExtraFieldsCfg]) } } func TestCdrsCfgAsMapInterface(t *testing.T) { - var cdrscfg CdrsCfg cfgJSONStr := `{ "cdrs": { "enabled": false, - "extra_fields": [], + "extra_fields": ["~Custom_Val:s/(\\d+)/+$1/"], "store_cdrs": true, "session_cost_retries": 5, "chargers_conns":["*localhost"], @@ -107,33 +103,33 @@ func TestCdrsCfgAsMapInterface(t *testing.T) { "thresholds_conns": [], "stats_conns": [], "online_cdr_exports":[], - "scheduler_conns": [], + "scheduler_conns": [], + "ees_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{}, + utils.EnabledCfg: false, + utils.ExtraFieldsCfg: []string{"~Custom_Val:s/(\\d+)/+$1/"}, + utils.StoreCdrsCfg: true, + utils.SessionCostRetires: 5, + utils.ChargerSConnsCfg: []string{"*localhost"}, + utils.RALsConnsCfg: []string{"*internal"}, + utils.AttributeSConnsCfg: []string{}, + utils.ThresholdSConnsCfg: []string{}, + utils.StatSConnsCfg: []string{}, + utils.OnlineCDRExportsCfg: []string{}, + utils.SchedulerConnsCfg: []string{}, + utils.EEsConnsCfg: []string{}, } - if jsnCfg, err := NewCgrJsonCfgFromBytes([]byte(cfgJSONStr)); err != nil { + if cgrCfg, err := NewCGRConfigFromJsonStringWithDefaults(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)) + } else if rcv := cgrCfg.cdrsCfg.AsMapInterface(); !reflect.DeepEqual(rcv, eMap) { + t.Errorf("Expected %+v \n, recieved %+v ", eMap, rcv) } +} - cfgJSONStr = `{ +func TestCdrsCfgAsMapInterface1(t *testing.T) { + cfgJSONStr := `{ "cdrs": { "enabled": true, "extra_fields": ["PayPalAccount", "LCRProfile", "ResourceID"], @@ -145,29 +141,57 @@ func TestCdrsCfgAsMapInterface(t *testing.T) { "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"], + "scheduler_conns": ["*internal"], + "ees_conns": [], }, }` - 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"}, + eMap := map[string]interface{}{ + utils.EnabledCfg: true, + utils.ExtraFieldsCfg: []string{"PayPalAccount", "LCRProfile", "ResourceID"}, + utils.StoreCdrsCfg: true, + utils.SessionCostRetires: 9, + utils.ChargerSConnsCfg: []string{"*internal"}, + utils.RALsConnsCfg: []string{"*internal"}, + utils.AttributeSConnsCfg: []string{"*internal"}, + utils.ThresholdSConnsCfg: []string{"*internal"}, + utils.StatSConnsCfg: []string{"*internal"}, + utils.OnlineCDRExportsCfg: []string{"http_localhost", "amqp_localhost", "http_test_file", "amqp_test_file", "aws_test_file", "sqs_test_file", "kafka_localhost", "s3_test_file"}, + utils.SchedulerConnsCfg: []string{"*internal"}, + utils.EEsConnsCfg: []string{}, } - if jsnCfg, err := NewCgrJsonCfgFromBytes([]byte(cfgJSONStr)); err != nil { + if cgrCfg, err := NewCGRConfigFromJsonStringWithDefaults(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)) + } else if rcv := cgrCfg.cdrsCfg.AsMapInterface(); !reflect.DeepEqual(rcv, eMap) { + t.Errorf("Expected %+v \n, recieved %+v", eMap, rcv) + } +} + +func TestCdrsCfgAsMapInterface2(t *testing.T) { + cfgJsonStr := `{ + "cdrs": { + "enabled":true, + "chargers_conns": ["conn1", "conn2"], + "attributes_conns": ["*internal"], + "ees_conns": ["conn1"], + }, +}` + eMap := map[string]interface{}{ + utils.EnabledCfg: true, + utils.ExtraFieldsCfg: []string{}, + utils.StoreCdrsCfg: true, + utils.SessionCostRetires: 5, + utils.ChargerSConnsCfg: []string{"conn1", "conn2"}, + utils.RALsConnsCfg: []string{}, + utils.AttributeSConnsCfg: []string{"*internal"}, + utils.ThresholdSConnsCfg: []string{}, + utils.StatSConnsCfg: []string{}, + utils.OnlineCDRExportsCfg: []string{}, + utils.SchedulerConnsCfg: []string{}, + utils.EEsConnsCfg: []string{"conn1"}, + } + if cgrCfg, err := NewCGRConfigFromJsonStringWithDefaults(cfgJsonStr); err != nil { + t.Error(err) + } else if rcv := cgrCfg.cdrsCfg.AsMapInterface(); !reflect.DeepEqual(rcv, eMap) { + t.Errorf("Expected %+v \n, recieved %+v", eMap, rcv) } } diff --git a/utils/consts.go b/utils/consts.go index 1f5095f41..73b32818e 100755 --- a/utils/consts.go +++ b/utils/consts.go @@ -1987,6 +1987,7 @@ const ( ChargerSConnsCfg = "chargers_conns" AttributeSConnsCfg = "attributes_conns" OnlineCDRExportsCfg = "online_cdr_exports" + SessionCostRetires = "session_cost_retries" ) // SessionSCfg