diff --git a/apier/v1/resourcesv1_it_test.go b/apier/v1/resourcesv1_it_test.go index 1d47019fe..eabcd00b7 100644 --- a/apier/v1/resourcesv1_it_test.go +++ b/apier/v1/resourcesv1_it_test.go @@ -156,7 +156,7 @@ func testV1RsGetResourcesForEvent(t *testing.T) { return } if len(*reply) != 1 { - t.Errorf("Expecting: %+v, received: %+v", 1, len(*reply)) + t.Fatalf("Expecting: %+v, received: %+v", 1, len(*reply)) } if (*reply)[0].ID != "ResGroup2" { t.Errorf("Expecting: %+v, received: %+v", "ResGroup2", (*reply)[0].ID) diff --git a/config/config_defaults.go b/config/config_defaults.go index 47294ca72..90b554e60 100755 --- a/config/config_defaults.go +++ b/config/config_defaults.go @@ -227,7 +227,7 @@ const CGRATES_CFG_JSON = ` "filters": { // Filters configuration (*new) "stats_conns": [], // connections to StatS for <*stats> filters, empty to disable stats functionality: <""|*internal|x.y.z.y:1234> "resources_conns": [], // connections to ResourceS for <*resources> filters, empty to disable stats functionality: <""|*internal|x.y.z.y:1234> - "rals_conns": [], // connections to RALs for <*accounts> filters, empty to disable stats functionality: <""|*internal|x.y.z.y:1234> + "apiers_conns": [], // connections to RALs for <*accounts> filters, empty to disable stats functionality: <""|*internal|x.y.z.y:1234> }, diff --git a/config/config_json_test.go b/config/config_json_test.go index 56d612398..02495eed3 100755 --- a/config/config_json_test.go +++ b/config/config_json_test.go @@ -867,7 +867,7 @@ func TestDfFilterSJsonCfg(t *testing.T) { eCfg := &FilterSJsonCfg{ Stats_conns: &[]string{}, Resources_conns: &[]string{}, - Rals_conns: &[]string{}, + Apiers_conns: &[]string{}, } if cfg, err := dfCgrJsonCfg.FilterSJsonCfg(); err != nil { t.Error(err) diff --git a/config/config_test.go b/config/config_test.go index 29069054a..d357930eb 100755 --- a/config/config_test.go +++ b/config/config_test.go @@ -761,7 +761,7 @@ func TestCgrCfgJSONDefaultFiltersCfg(t *testing.T) { eFiltersCfg := &FilterSCfg{ StatSConns: []string{}, ResourceSConns: []string{}, - RALsConns: []string{}, + ApierSConns: []string{}, } if !reflect.DeepEqual(cgrCfg.filterSCfg, eFiltersCfg) { t.Errorf("received: %+v, expecting: %+v", cgrCfg.filterSCfg, eFiltersCfg) diff --git a/config/configsanity.go b/config/configsanity.go index 6f93aff30..ecd6ffa84 100644 --- a/config/configsanity.go +++ b/config/configsanity.go @@ -510,9 +510,9 @@ func (cfg *CGRConfig) checkConfigSanity() error { return fmt.Errorf("<%s> connection with id: <%s> not defined", utils.FilterS, connID) } } - for _, connID := range cfg.filterSCfg.RALsConns { + for _, connID := range cfg.filterSCfg.ApierSConns { if strings.HasPrefix(connID, utils.MetaInternal) && !cfg.ralsCfg.Enabled { - return fmt.Errorf("<%s> not enabled but requested by <%s> component.", utils.RALService, utils.FilterS) + return fmt.Errorf("<%s> not enabled but requested by <%s> component.", utils.ApierS, utils.FilterS) } if _, has := cfg.rpcConns[connID]; !has && !strings.HasPrefix(connID, utils.MetaInternal) { return fmt.Errorf("<%s> connection with id: <%s> not defined", utils.FilterS, connID) diff --git a/config/configsanity_test.go b/config/configsanity_test.go index 98333f4fe..9226091b9 100644 --- a/config/configsanity_test.go +++ b/config/configsanity_test.go @@ -872,12 +872,12 @@ func TestConfigSanityFilterS(t *testing.T) { } cfg.filterSCfg.ResourceSConns = []string{} - cfg.filterSCfg.RALsConns = []string{utils.MetaInternal} + cfg.filterSCfg.ApierSConns = []string{utils.MetaInternal} - if err := cfg.checkConfigSanity(); err == nil || err.Error() != " not enabled but requested by component." { + if err := cfg.checkConfigSanity(); err == nil || err.Error() != " not enabled but requested by component." { t.Error(err) } - cfg.filterSCfg.RALsConns = []string{"test"} + cfg.filterSCfg.ApierSConns = []string{"test"} expected = " connection with id: not defined" if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { t.Errorf("Expecting: %+q received: %+q", expected, err) diff --git a/config/filterscfg.go b/config/filterscfg.go index c273d7d8b..29e5d2cce 100644 --- a/config/filterscfg.go +++ b/config/filterscfg.go @@ -23,7 +23,7 @@ import "github.com/cgrates/cgrates/utils" type FilterSCfg struct { StatSConns []string ResourceSConns []string - RALsConns []string + ApierSConns []string } func (fSCfg *FilterSCfg) loadFromJsonCfg(jsnCfg *FilterSJsonCfg) (err error) { @@ -52,14 +52,14 @@ func (fSCfg *FilterSCfg) loadFromJsonCfg(jsnCfg *FilterSJsonCfg) (err error) { } } } - if jsnCfg.Rals_conns != nil { - fSCfg.RALsConns = make([]string, len(*jsnCfg.Rals_conns)) - for idx, connID := range *jsnCfg.Rals_conns { + if jsnCfg.Apiers_conns != nil { + fSCfg.ApierSConns = make([]string, len(*jsnCfg.Apiers_conns)) + for idx, connID := range *jsnCfg.Apiers_conns { // if we have the connection internal we change the name so we can have internal rpc for each subsystem if connID == utils.MetaInternal { - fSCfg.RALsConns[idx] = utils.ConcatenatedKey(utils.MetaInternal, utils.MetaResponder) + fSCfg.ApierSConns[idx] = utils.ConcatenatedKey(utils.MetaInternal, utils.MetaApier) } else { - fSCfg.RALsConns[idx] = connID + fSCfg.ApierSConns[idx] = connID } } } diff --git a/config/libconfig_json.go b/config/libconfig_json.go index 40856da68..0bfb80e39 100755 --- a/config/libconfig_json.go +++ b/config/libconfig_json.go @@ -107,7 +107,7 @@ type ItemOptJson struct { type FilterSJsonCfg struct { Stats_conns *[]string Resources_conns *[]string - Rals_conns *[]string + Apiers_conns *[]string } // Rater config section diff --git a/data/conf/samples/filters/cgrates.json b/data/conf/samples/filters/cgrates.json index c42410302..09bf6574b 100644 --- a/data/conf/samples/filters/cgrates.json +++ b/data/conf/samples/filters/cgrates.json @@ -40,7 +40,7 @@ "filters": { "stats_conns": ["*localhost"], "resources_conns": ["*localhost"], - "rals_conns": ["*localhost"], + "apiers_conns": ["*localhost"], }, diff --git a/data/conf/samples/filters_gob/cgrates.json b/data/conf/samples/filters_gob/cgrates.json index 83f42d29b..4c39131ad 100644 --- a/data/conf/samples/filters_gob/cgrates.json +++ b/data/conf/samples/filters_gob/cgrates.json @@ -47,7 +47,7 @@ "filters": { "stats_conns": ["conn1"], "resources_conns": ["conn1"], - "rals_conns": ["conn1"], + "apiers_conns": ["conn1"], }, diff --git a/data/conf/samples/filters_internal/cgrates.json b/data/conf/samples/filters_internal/cgrates.json index 62758502b..7e5295eeb 100644 --- a/data/conf/samples/filters_internal/cgrates.json +++ b/data/conf/samples/filters_internal/cgrates.json @@ -38,7 +38,7 @@ "filters": { "stats_conns": ["*localhost"], "resources_conns": ["*localhost"], - "rals_conns": ["*localhost"], + "apiers_conns": ["*localhost"], }, diff --git a/data/conf/samples/filters_mongo/cgrates.json b/data/conf/samples/filters_mongo/cgrates.json index 74bbb092f..6c55ec8d3 100644 --- a/data/conf/samples/filters_mongo/cgrates.json +++ b/data/conf/samples/filters_mongo/cgrates.json @@ -43,7 +43,7 @@ "filters": { "stats_conns": ["*localhost"], "resources_conns": ["*localhost"], - "rals_conns": ["*localhost"], + "apiers_conns": ["*localhost"], }, diff --git a/data/conf/samples/filters_mysql/cgrates.json b/data/conf/samples/filters_mysql/cgrates.json index c42410302..09bf6574b 100644 --- a/data/conf/samples/filters_mysql/cgrates.json +++ b/data/conf/samples/filters_mysql/cgrates.json @@ -40,7 +40,7 @@ "filters": { "stats_conns": ["*localhost"], "resources_conns": ["*localhost"], - "rals_conns": ["*localhost"], + "apiers_conns": ["*localhost"], }, diff --git a/data/conf/samples/tutinternal/cgrates.json b/data/conf/samples/tutinternal/cgrates.json index 0e356f187..8f1fa3442 100644 --- a/data/conf/samples/tutinternal/cgrates.json +++ b/data/conf/samples/tutinternal/cgrates.json @@ -100,4 +100,8 @@ }, +"filters": { + "apiers_conns": ["*internal"], +}, + } diff --git a/data/conf/samples/tutinternal_gob/cgrates.json b/data/conf/samples/tutinternal_gob/cgrates.json index f10c01002..eb3901600 100644 --- a/data/conf/samples/tutinternal_gob/cgrates.json +++ b/data/conf/samples/tutinternal_gob/cgrates.json @@ -106,4 +106,8 @@ }, +"filters": { + "apiers_conns": ["*internal"], +}, + } diff --git a/data/conf/samples/tutinternal_new/cgrates.json b/data/conf/samples/tutinternal_new/cgrates.json index 9e7d19ae6..71412ae7f 100644 --- a/data/conf/samples/tutinternal_new/cgrates.json +++ b/data/conf/samples/tutinternal_new/cgrates.json @@ -119,4 +119,8 @@ }, +"filters": { + "apiers_conns": ["*internal"], +}, + } diff --git a/data/conf/samples/tutmongo/cgrates.json b/data/conf/samples/tutmongo/cgrates.json index d43fa1be6..e585e85cc 100644 --- a/data/conf/samples/tutmongo/cgrates.json +++ b/data/conf/samples/tutmongo/cgrates.json @@ -130,4 +130,8 @@ }, +"filters": { + "apiers_conns": ["*internal"], +}, + } diff --git a/data/conf/samples/tutmongo2/cgrates.json b/data/conf/samples/tutmongo2/cgrates.json index fef20cd92..aa51c46e0 100644 --- a/data/conf/samples/tutmongo2/cgrates.json +++ b/data/conf/samples/tutmongo2/cgrates.json @@ -135,4 +135,8 @@ }, +"filters": { + "apiers_conns": ["*internal"], +}, + } diff --git a/data/conf/samples/tutmongo2_gob/cgrates.json b/data/conf/samples/tutmongo2_gob/cgrates.json index 1df7fc1cc..2be00a011 100644 --- a/data/conf/samples/tutmongo2_gob/cgrates.json +++ b/data/conf/samples/tutmongo2_gob/cgrates.json @@ -142,4 +142,8 @@ }, +"filters": { + "apiers_conns": ["*internal"], +}, + } diff --git a/data/conf/samples/tutmongo_gob/cgrates.json b/data/conf/samples/tutmongo_gob/cgrates.json index acd2f6c20..76c81af02 100644 --- a/data/conf/samples/tutmongo_gob/cgrates.json +++ b/data/conf/samples/tutmongo_gob/cgrates.json @@ -137,4 +137,8 @@ }, +"filters": { + "apiers_conns": ["*internal"], +}, + } diff --git a/data/conf/samples/tutmongonew/cgrates.json b/data/conf/samples/tutmongonew/cgrates.json index 87c862081..b27fe36b6 100644 --- a/data/conf/samples/tutmongonew/cgrates.json +++ b/data/conf/samples/tutmongonew/cgrates.json @@ -127,4 +127,8 @@ }, +"filters": { + "apiers_conns": ["*internal"], +}, + } diff --git a/data/conf/samples/tutmysql/cgrates.json b/data/conf/samples/tutmysql/cgrates.json index a77853323..370e6daac 100644 --- a/data/conf/samples/tutmysql/cgrates.json +++ b/data/conf/samples/tutmysql/cgrates.json @@ -127,4 +127,8 @@ }, +"filters": { + "apiers_conns": ["*internal"], +}, + } diff --git a/data/conf/samples/tutmysql2/cgrates.json b/data/conf/samples/tutmysql2/cgrates.json index fd7b7a067..ab72dec77 100644 --- a/data/conf/samples/tutmysql2/cgrates.json +++ b/data/conf/samples/tutmysql2/cgrates.json @@ -99,4 +99,9 @@ "enabled": true, "scheduler_conns": ["*localhost"], }, + +"filters": { + "apiers_conns": ["*internal"], +}, + } diff --git a/data/conf/samples/tutmysql2_gob/cgrates.json b/data/conf/samples/tutmysql2_gob/cgrates.json index e05cec497..603422392 100644 --- a/data/conf/samples/tutmysql2_gob/cgrates.json +++ b/data/conf/samples/tutmysql2_gob/cgrates.json @@ -108,4 +108,9 @@ "enabled": true, "scheduler_conns": ["*internal"], }, + +"filters": { + "apiers_conns": ["*internal"], +}, + } diff --git a/data/conf/samples/tutmysql_internal/cgrates.json b/data/conf/samples/tutmysql_internal/cgrates.json index bcaba0c6d..baa3c8019 100644 --- a/data/conf/samples/tutmysql_internal/cgrates.json +++ b/data/conf/samples/tutmysql_internal/cgrates.json @@ -240,4 +240,8 @@ }, +"filters": { + "apiers_conns": ["*internal"], +}, + } diff --git a/data/conf/samples/tutpostgres/cgrates.json b/data/conf/samples/tutpostgres/cgrates.json index 4f030d866..1363a9c4b 100644 --- a/data/conf/samples/tutpostgres/cgrates.json +++ b/data/conf/samples/tutpostgres/cgrates.json @@ -97,4 +97,10 @@ "enabled": true, "scheduler_conns": ["*internal"], }, + + +"filters": { + "apiers_conns": ["*internal"], +}, + } diff --git a/engine/filters.go b/engine/filters.go index 5467e51be..487158e6a 100644 --- a/engine/filters.go +++ b/engine/filters.go @@ -345,16 +345,19 @@ func (fltr *FilterRule) passDestinations(fielNameDP config.DataProvider, fieldVa return false, err } for _, p := range utils.SplitPrefix(dst, MIN_PREFIX_MATCH) { - if destIDs, err := dm.GetReverseDestination(p, false, utils.NonTransactional); err == nil { - for _, dID := range destIDs { - for i, valDstID := range fltr.Values { - valDstID, err := config.DPDynamicString(valDstID, fieldValuesDP[i]) - if err != nil { - continue - } - if valDstID == dID { - return true, nil - } + var destIDs []string + if err = connMgr.Call(config.CgrConfig().FilterSCfg().ApierSConns, nil, utils.APIerSv1GetReverseDestination, + p, &destIDs); err != nil { + continue + } + for _, dID := range destIDs { + for i, valDstID := range fltr.Values { + valDstID, err := config.DPDynamicString(valDstID, fieldValuesDP[i]) + if err != nil { + continue + } + if valDstID == dID { + return true, nil } } } @@ -442,7 +445,7 @@ func (fS *FilterS) getFieldNameDataProvider(initialDP config.DataProvider, return nil, fmt.Errorf("invalid fieldname <%s>", fieldName) } var account *Account - if err = fS.connMgr.Call(fS.cfg.FilterSCfg().RALsConns, nil, utils.APIerSv2GetAccount, + if err = fS.connMgr.Call(fS.cfg.FilterSCfg().ApierSConns, nil, utils.APIerSv2GetAccount, &utils.AttrGetAccount{Tenant: tenant, Account: splitFldName[1]}, &account); err != nil { return } @@ -518,7 +521,7 @@ func (fS *FilterS) getFieldValueDataProvider(initialDP config.DataProvider, return nil, fmt.Errorf("invalid fieldname <%s>", fieldValue) } var account *Account - if err = fS.connMgr.Call(fS.cfg.FilterSCfg().RALsConns, nil, utils.APIerSv2GetAccount, + if err = fS.connMgr.Call(fS.cfg.FilterSCfg().ApierSConns, nil, utils.APIerSv2GetAccount, &utils.AttrGetAccount{Tenant: tenant, Account: splitFldName[1]}, &account); err != nil { return } diff --git a/engine/filters_test.go b/engine/filters_test.go index b00e7d9a3..a37eb94b5 100644 --- a/engine/filters_test.go +++ b/engine/filters_test.go @@ -21,6 +21,7 @@ import ( "github.com/cgrates/cgrates/config" "github.com/cgrates/cgrates/utils" + "github.com/cgrates/rpcclient" ) func TestFilterPassString(t *testing.T) { @@ -305,9 +306,37 @@ func TestFilterPassRSRFields(t *testing.T) { } } +// structure to mimic the APIerSv1 to test *destination +type apierSv1Dummy struct { + DataManager *DataManager +} + +func (apiv1 *apierSv1Dummy) GetReverseDestination(prefix string, reply *[]string) (err error) { + if prefix == "" { + return utils.NewErrMandatoryIeMissing("prefix") + } + var revLst []string + if revLst, err = apiv1.DataManager.GetReverseDestination(prefix, false, utils.NonTransactional); err != nil { + return + } + *reply = revLst + return +} + +func (apiv1 *apierSv1Dummy) Call(serviceMethod string, + args interface{}, reply interface{}) error { + return utils.APIerRPCCall(apiv1, serviceMethod, args, reply) +} + func TestFilterPassDestinations(t *testing.T) { Cache.Set(utils.CacheReverseDestinations, "+49", []string{"DE", "EU_LANDLINE"}, nil, true, "") + config.CgrConfig().FilterSCfg().ApierSConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaApier)} + internalAPIerSv1Chan := make(chan rpcclient.ClientConnector, 1) + internalAPIerSv1Chan <- &apierSv1Dummy{DataManager: dm} + connMgr = NewConnManager(config.CgrConfig(), map[string]chan rpcclient.ClientConnector{ + utils.ConcatenatedKey(utils.MetaInternal, utils.MetaApier): internalAPIerSv1Chan, + }) cd := &CallDescriptor{ Category: "call", Tenant: "cgrates.org",