diff --git a/apis/loaders_it_test.go b/apis/loaders_it_test.go
index 66180c4d5..8f114db6d 100644
--- a/apis/loaders_it_test.go
+++ b/apis/loaders_it_test.go
@@ -302,17 +302,17 @@ cgrates.org,ResGroup22,*string:~*req.Account:dan,;10,3600s,2,premium_call,true,t
// Create and populate Routes.csv
if err := writeFile(utils.RoutesCsv, `
-#Tenant[0],ID[1],FilterIDs[2],Weights[3],Sorting[4],SortingParameters[5],RouteID[6],RouteFilterIDs[7],RouteAccountIDs[8],RouteRateProfileIDs[9],RouteResourceIDs[10],RouteStatIDs[11],RouteWeights[12],RouteBlocker[13],RouteParameters[14]
-cgrates.org,RoutePrf1,,,,,,,,,,,,,
-cgrates.org,RoutePrf1,*string:~*req.Account:1001,;20,*lc,,,,,,,,,,
-cgrates.org,RoutePrf1,,,,,route1,fltr1,Account1;Account2,RPL_1,ResGroup1,Stat1,,true,param1
-cgrates.org,RoutePrf1,,,,,,,,,,,,,
-cgrates.org,RoutePrf1,,,,,route1,,,RPL_2,ResGroup2,,;10,,
-cgrates.org,RoutePrf1,,,,,route1,fltr2,,RPL_3,ResGroup3,Stat2,,,param2
-cgrates.org,RoutePrf1,,,,,route1,,,,ResGroup4,Stat3,,,
-cgrates.org,RoutePrf1,,,,,route2,fltr5,Account1,RPL_1,ResGroup1,Stat1,fltr1;10,true,param1
-cgrates.org,RoutePrf2,,,,,,,,,,,,,
-cgrates.org,RoutePrf2,*string:~*req.Account:1002,;20,*lc,,route1,fltr3,Account3;Account4,RPL_2,ResGroup2,Stat2,;10,true,param1
+#Tenant[0],ID[1],FilterIDs[2],Weights[3],Sorting[4],SortingParameters[5],Blockers[6],RouteID[7],RouteFilterIDs[8],RouteAccountIDs[9],RouteRateProfileIDs[10],RouteResourceIDs[11],RouteStatIDs[12],RouteWeights[13],RouteBlocker[14],RouteParameters[15]
+cgrates.org,RoutePrf1,,,,,,,,,,,,,,
+cgrates.org,RoutePrf1,*string:~*req.Account:1001,;20,*lc,,;true,,,,,,,,,
+cgrates.org,RoutePrf1,,,,,,route1,fltr1,Account1;Account2,RPL_1,ResGroup1,Stat1,,true,param1
+cgrates.org,RoutePrf1,,,,,,,,,,,,,,
+cgrates.org,RoutePrf1,,,,,,route1,,,RPL_2,ResGroup2,,;10,,
+cgrates.org,RoutePrf1,,,,,,route1,fltr2,,RPL_3,ResGroup3,Stat2,,,param2
+cgrates.org,RoutePrf1,,,,,,route1,,,,ResGroup4,Stat3,,,
+cgrates.org,RoutePrf1,,,,,,route2,fltr5,Account1,RPL_1,ResGroup1,Stat1,fltr1;10,true,param1
+cgrates.org,RoutePrf2,,,,,,,,,,,,,,
+cgrates.org,RoutePrf2,*string:~*req.Account:1002,;20,*lc,,,route1,fltr3,Account3;Account4,RPL_2,ResGroup2,Stat2,;10,true,param1
`); err != nil {
t.Fatal(err)
}
@@ -1046,6 +1046,11 @@ func testLoadersGetRouteProfiles(t *testing.T) {
ID: "RoutePrf1",
FilterIDs: []string{"*string:~*req.Account:1001"},
Sorting: utils.MetaLC,
+ Blockers: utils.Blockers{
+ {
+ Blocker: true,
+ },
+ },
Routes: []*engine.Route{
{
ID: "route1",
diff --git a/apis/routes.go b/apis/routes.go
index e8594652f..8c316e7e7 100644
--- a/apis/routes.go
+++ b/apis/routes.go
@@ -44,7 +44,7 @@ func (adms *AdminSv1) GetRouteProfile(ctx *context.Context, arg *utils.TenantIDW
}
// GetRouteProfileIDs returns list of routeProfile IDs registered for a tenant
-func (adms *AdminSv1) GetRouteProfileIDs(ctx *context.Context, args *utils.ArgsItemIDs, sppPrfIDs *[]string) (err error) {
+func (adms *AdminSv1) GetRouteProfileIDs(ctx *context.Context, args *utils.ArgsItemIDs, routeProfileIDs *[]string) (err error) {
tnt := args.Tenant
if tnt == utils.EmptyString {
tnt = adms.cfg.GeneralCfg().DefaultTenant
@@ -67,7 +67,7 @@ func (adms *AdminSv1) GetRouteProfileIDs(ctx *context.Context, args *utils.ArgsI
if limit, offset, maxItems, err = utils.GetPaginateOpts(args.APIOpts); err != nil {
return
}
- *sppPrfIDs, err = utils.Paginate(retIDs, limit, offset, maxItems)
+ *routeProfileIDs, err = utils.Paginate(retIDs, limit, offset, maxItems)
return
}
diff --git a/apis/routes_it_test.go b/apis/routes_it_test.go
index 21bdfb777..28583add0 100644
--- a/apis/routes_it_test.go
+++ b/apis/routes_it_test.go
@@ -22,6 +22,7 @@ along with this program. If not, see
package apis
import (
+ "fmt"
"path"
"reflect"
"sort"
@@ -54,6 +55,11 @@ var (
testRouteSSetRoute3,
testFilterSGetRoutes,
testFilterSGetRoutesWithPrefix,
+ testRouteSRemoveRouteProfiles,
+
+ // Blocker behaviour test
+ testRouteSSetRouteProfiles,
+ testRouteSGetRouteProfilesForEvent,
testRouteSKillEngine,
}
)
@@ -467,6 +473,168 @@ func testFilterSGetRoutesWithPrefix(t *testing.T) {
}
}
+func testRouteSRemoveRouteProfiles(t *testing.T) {
+ args := &utils.ArgsItemIDs{
+ Tenant: "cgrates.org",
+ }
+ expected := []string{"PrefixROUTE_ACNT_1002", "PrefixROUTE_ACNT_1003", "ROUTE_ACNT_1001"}
+ var routeProfileIDs []string
+ if err := roRPC.Call(context.Background(), utils.AdminSv1GetRouteProfileIDs, args, &routeProfileIDs); err != nil {
+ t.Fatal(err)
+ } else {
+ sort.Strings(routeProfileIDs)
+ if !utils.SliceStringEqual(routeProfileIDs, expected) {
+ t.Errorf("expected: <%+v>, \nreceived: <%+v>", expected, routeProfileIDs)
+ }
+ }
+ var reply string
+ for _, routeProfileID := range routeProfileIDs {
+ argsRem := utils.TenantIDWithAPIOpts{
+ TenantID: &utils.TenantID{
+ Tenant: "cgrates.org",
+ ID: routeProfileID,
+ },
+ }
+ if err := roRPC.Call(context.Background(), utils.AdminSv1RemoveRouteProfile, argsRem, &reply); err != nil {
+ t.Fatal(err)
+ }
+ }
+ if err := roRPC.Call(context.Background(), utils.AdminSv1GetRouteProfileIDs, args, &routeProfileIDs); err == nil ||
+ err.Error() != utils.ErrNotFound.Error() {
+ t.Errorf("expected: <%+v>, \nreceived: <%+v>", utils.ErrNotFound, err)
+ }
+}
+
+func testRouteSSetRouteProfiles(t *testing.T) {
+ routeProfiles := []*engine.RouteProfileWithAPIOpts{
+ {
+ RouteProfile: &engine.RouteProfile{
+ ID: "ROUTE_TEST_1",
+ Tenant: "cgrates.org",
+ FilterIDs: []string{"*string:~*req.TestCase:BlockerBehaviour"},
+ Weights: utils.DynamicWeights{
+ {
+ Weight: 30,
+ },
+ },
+ Blockers: utils.Blockers{
+ {
+ Blocker: true,
+ },
+ },
+ Sorting: utils.MetaWeight,
+ SortingParameters: []string{},
+ Routes: []*engine.Route{
+ {
+ ID: "routeTest",
+ },
+ },
+ },
+ },
+ {
+ RouteProfile: &engine.RouteProfile{
+ ID: "ROUTE_TEST_2",
+ Tenant: "cgrates.org",
+ FilterIDs: []string{"*string:~*req.TestCase:BlockerBehaviour"},
+ Weights: utils.DynamicWeights{
+ {
+ Weight: 10,
+ },
+ },
+ Blockers: utils.Blockers{
+ {
+ Blocker: true,
+ },
+ },
+ Sorting: utils.MetaWeight,
+ SortingParameters: []string{},
+ Routes: []*engine.Route{
+ {
+ ID: "routeTest",
+ },
+ },
+ },
+ },
+ {
+ RouteProfile: &engine.RouteProfile{
+ ID: "ROUTE_TEST_3",
+ Tenant: "cgrates.org",
+ FilterIDs: []string{"*string:~*req.TestCase:BlockerBehaviour"},
+ Weights: utils.DynamicWeights{
+ {
+ Weight: 20,
+ },
+ },
+ Sorting: utils.MetaWeight,
+ SortingParameters: []string{},
+ Routes: []*engine.Route{
+ {
+ ID: "routeTest",
+ },
+ },
+ },
+ },
+ {
+ RouteProfile: &engine.RouteProfile{
+ ID: "ROUTE_TEST_4",
+ Tenant: "cgrates.org",
+ FilterIDs: []string{"*string:~*req.TestCase:BlockerBehaviour"},
+ Weights: utils.DynamicWeights{
+ {
+ Weight: 5,
+ },
+ },
+ Sorting: utils.MetaWeight,
+ SortingParameters: []string{},
+ Routes: []*engine.Route{
+ {
+ ID: "routeTest",
+ },
+ },
+ },
+ },
+ }
+
+ var reply string
+ for _, routeProfile := range routeProfiles {
+ if err := roRPC.Call(context.Background(), utils.AdminSv1SetRouteProfile,
+ routeProfile, &reply); err != nil {
+ t.Error(err)
+ } else if reply != utils.OK {
+ t.Error(err)
+ }
+ }
+
+ argsGet := &utils.TenantIDWithAPIOpts{
+ TenantID: &utils.TenantID{
+ Tenant: "cgrates.org",
+ ID: "ROUTE_TEST_1",
+ },
+ }
+ var result engine.RouteProfile
+ if err := roRPC.Call(context.Background(), utils.AdminSv1GetRouteProfile,
+ argsGet, &result); err != nil {
+ t.Error(err)
+ }
+ fmt.Println(utils.ToJSON(result))
+}
+
+func testRouteSGetRouteProfilesForEvent(t *testing.T) {
+ args := &utils.CGREvent{
+ Tenant: "cgrates.org",
+ ID: "EventGetRouteProfiles",
+ Event: map[string]interface{}{
+ "TestCase": "BlockerBehaviour",
+ },
+ APIOpts: map[string]interface{}{},
+ }
+ var reply []*engine.RouteProfile
+ if err := roRPC.Call(context.Background(), utils.RouteSv1GetRouteProfilesForEvent, args, &reply); err != nil {
+ t.Error(err)
+ }
+ fmt.Println(utils.ToJSON(reply))
+}
+
//Kill the engine when it is about to be finished
func testRouteSKillEngine(t *testing.T) {
if err := engine.KillEngine(100); err != nil {
diff --git a/config/config_defaults.go b/config/config_defaults.go
index 7e306a7ac..bc7b2175b 100644
--- a/config/config_defaults.go
+++ b/config/config_defaults.go
@@ -1273,15 +1273,16 @@ const CGRATES_CFG_JSON = `
{"tag": "Weights", "path": "Weights", "type": "*variable", "value": "~*req.3"},
{"tag": "Sorting", "path": "Sorting", "type": "*variable", "value": "~*req.4"},
{"tag": "SortingParameters", "path": "SortingParameters", "type": "*variable", "value": "~*req.5"},
- {"tag": "RouteID", "path": "Routes.ID", "type": "*variable", "value": "~*req.6","new_branch":true},
- {"tag": "RouteFilterIDs", "path": "Routes.FilterIDs", "type": "*variable", "value": "~*req.7"},
- {"tag": "RouteAccountIDs", "path": "Routes.AccountIDs", "type": "*variable", "value": "~*req.8"},
- {"tag": "RouteRateProfileIDs", "path": "Routes.RateProfileIDs", "type": "*variable", "value": "~*req.9"},
- {"tag": "RouteResourceIDs", "path": "Routes.ResourceIDs", "type": "*variable", "value": "~*req.10"},
- {"tag": "RouteStatIDs", "path": "Routes.StatIDs", "type": "*variable", "value": "~*req.11"},
- {"tag": "RouteWeights", "path": "Routes.Weights", "type": "*variable", "value": "~*req.12"},
- {"tag": "RouteBlocker", "path": "Routes.Blocker", "type": "*variable", "value": "~*req.13"},
- {"tag": "RouteParameters", "path": "Routes.RouteParameters", "type": "*variable", "value": "~*req.14"},
+ {"tag": "Blockers", "path": "Blockers", "type": "*variable", "value": "~*req.6"},
+ {"tag": "RouteID", "path": "Routes.ID", "type": "*variable", "value": "~*req.7","new_branch":true},
+ {"tag": "RouteFilterIDs", "path": "Routes.FilterIDs", "type": "*variable", "value": "~*req.8"},
+ {"tag": "RouteAccountIDs", "path": "Routes.AccountIDs", "type": "*variable", "value": "~*req.9"},
+ {"tag": "RouteRateProfileIDs", "path": "Routes.RateProfileIDs", "type": "*variable", "value": "~*req.10"},
+ {"tag": "RouteResourceIDs", "path": "Routes.ResourceIDs", "type": "*variable", "value": "~*req.11"},
+ {"tag": "RouteStatIDs", "path": "Routes.StatIDs", "type": "*variable", "value": "~*req.12"},
+ {"tag": "RouteWeights", "path": "Routes.Weights", "type": "*variable", "value": "~*req.13"},
+ {"tag": "RouteBlocker", "path": "Routes.Blocker", "type": "*variable", "value": "~*req.14"},
+ {"tag": "RouteParameters", "path": "Routes.RouteParameters", "type": "*variable", "value": "~*req.15"},
],
},
{
diff --git a/config/loaderscfg_test.go b/config/loaderscfg_test.go
index b32d62d96..a3dcd596d 100644
--- a/config/loaderscfg_test.go
+++ b/config/loaderscfg_test.go
@@ -357,51 +357,56 @@ func TestLoaderSCfgloadFromJsonCfgCase1(t *testing.T) {
Type: utils.MetaVariable,
Value: NewRSRParsersMustCompile("~*req.5", utils.InfieldSep),
Layout: time.RFC3339},
+ {Tag: "Blockers",
+ Path: "Blockers",
+ Type: utils.MetaVariable,
+ Value: NewRSRParsersMustCompile("~*req.6", utils.InfieldSep),
+ Layout: time.RFC3339},
{Tag: "RouteID",
Path: "Routes.ID",
Type: utils.MetaVariable,
- Value: NewRSRParsersMustCompile("~*req.6", utils.InfieldSep),
+ Value: NewRSRParsersMustCompile("~*req.7", utils.InfieldSep),
NewBranch: true,
Layout: time.RFC3339},
{Tag: "RouteFilterIDs",
Path: "Routes.FilterIDs",
Type: utils.MetaVariable,
- Value: NewRSRParsersMustCompile("~*req.7", utils.InfieldSep),
+ Value: NewRSRParsersMustCompile("~*req.8", utils.InfieldSep),
Layout: time.RFC3339},
{Tag: "RouteAccountIDs",
Path: "Routes.AccountIDs",
Type: utils.MetaVariable,
- Value: NewRSRParsersMustCompile("~*req.8", utils.InfieldSep),
+ Value: NewRSRParsersMustCompile("~*req.9", utils.InfieldSep),
Layout: time.RFC3339},
{Tag: "RouteRateProfileIDs",
Path: "Routes.RateProfileIDs",
Type: utils.MetaVariable,
- Value: NewRSRParsersMustCompile("~*req.9", utils.InfieldSep),
+ Value: NewRSRParsersMustCompile("~*req.10", utils.InfieldSep),
Layout: time.RFC3339},
{Tag: "RouteResourceIDs",
Path: "Routes.ResourceIDs",
Type: utils.MetaVariable,
- Value: NewRSRParsersMustCompile("~*req.10", utils.InfieldSep),
+ Value: NewRSRParsersMustCompile("~*req.11", utils.InfieldSep),
Layout: time.RFC3339},
{Tag: "RouteStatIDs",
Path: "Routes.StatIDs",
Type: utils.MetaVariable,
- Value: NewRSRParsersMustCompile("~*req.11", utils.InfieldSep),
+ Value: NewRSRParsersMustCompile("~*req.12", utils.InfieldSep),
Layout: time.RFC3339},
{Tag: "RouteWeights",
Path: "Routes.Weights",
Type: utils.MetaVariable,
- Value: NewRSRParsersMustCompile("~*req.12", utils.InfieldSep),
+ Value: NewRSRParsersMustCompile("~*req.13", utils.InfieldSep),
Layout: time.RFC3339},
{Tag: "RouteBlocker",
Path: "Routes.Blocker",
Type: utils.MetaVariable,
- Value: NewRSRParsersMustCompile("~*req.13", utils.InfieldSep),
+ Value: NewRSRParsersMustCompile("~*req.14", utils.InfieldSep),
Layout: time.RFC3339},
{Tag: "RouteParameters",
Path: "Routes.RouteParameters",
Type: utils.MetaVariable,
- Value: NewRSRParsersMustCompile("~*req.14", utils.InfieldSep),
+ Value: NewRSRParsersMustCompile("~*req.15", utils.InfieldSep),
Layout: time.RFC3339},
},
},
@@ -1455,60 +1460,66 @@ func TestLoaderCfgAsMapInterfaceCase1(t *testing.T) {
utils.TypeCfg: "*variable",
utils.ValueCfg: "~*req.5",
},
+ {
+ utils.TagCfg: "Blockers",
+ utils.PathCfg: "Blockers",
+ utils.TypeCfg: "*variable",
+ utils.ValueCfg: "~*req.6",
+ },
{
utils.NewBranchCfg: true,
utils.TagCfg: "RouteID",
utils.PathCfg: "Routes.ID",
utils.TypeCfg: "*variable",
- utils.ValueCfg: "~*req.6",
+ utils.ValueCfg: "~*req.7",
},
{
utils.TagCfg: "RouteFilterIDs",
utils.PathCfg: "Routes.FilterIDs",
utils.TypeCfg: "*variable",
- utils.ValueCfg: "~*req.7",
+ utils.ValueCfg: "~*req.8",
},
{
utils.TagCfg: "RouteAccountIDs",
utils.PathCfg: "Routes.AccountIDs",
utils.TypeCfg: "*variable",
- utils.ValueCfg: "~*req.8",
+ utils.ValueCfg: "~*req.9",
},
{
utils.TagCfg: "RouteRateProfileIDs",
utils.PathCfg: "Routes.RateProfileIDs",
utils.TypeCfg: "*variable",
- utils.ValueCfg: "~*req.9",
+ utils.ValueCfg: "~*req.10",
},
{
utils.TagCfg: "RouteResourceIDs",
utils.PathCfg: "Routes.ResourceIDs",
utils.TypeCfg: "*variable",
- utils.ValueCfg: "~*req.10",
+ utils.ValueCfg: "~*req.11",
},
{
utils.TagCfg: "RouteStatIDs",
utils.PathCfg: "Routes.StatIDs",
utils.TypeCfg: "*variable",
- utils.ValueCfg: "~*req.11",
+ utils.ValueCfg: "~*req.12",
},
{
utils.TagCfg: "RouteWeights",
utils.PathCfg: "Routes.Weights",
utils.TypeCfg: "*variable",
- utils.ValueCfg: "~*req.12",
+ utils.ValueCfg: "~*req.13",
},
{
utils.TagCfg: "RouteBlocker",
utils.PathCfg: "Routes.Blocker",
utils.TypeCfg: "*variable",
- utils.ValueCfg: "~*req.13",
+ utils.ValueCfg: "~*req.14",
},
{
utils.TagCfg: "RouteParameters",
utils.PathCfg: "Routes.RouteParameters",
utils.TypeCfg: "*variable",
- utils.ValueCfg: "~*req.14",
+ utils.ValueCfg: "~*req.15",
},
},
},
diff --git a/data/conf/cgrates/cgrates.json b/data/conf/cgrates/cgrates.json
index 61047fd89..ac927e908 100755
--- a/data/conf/cgrates/cgrates.json
+++ b/data/conf/cgrates/cgrates.json
@@ -1250,15 +1250,16 @@
// {"tag": "Weights", "path": "Weights", "type": "*variable", "value": "~*req.3"},
// {"tag": "Sorting", "path": "Sorting", "type": "*variable", "value": "~*req.4"},
// {"tag": "SortingParameters", "path": "SortingParameters", "type": "*variable", "value": "~*req.5"},
-// {"tag": "RouteID", "path": "Routes.ID", "type": "*variable", "value": "~*req.6","new_branch":true},
-// {"tag": "RouteFilterIDs", "path": "Routes.FilterIDs", "type": "*variable", "value": "~*req.7"},
-// {"tag": "RouteAccountIDs", "path": "Routes.AccountIDs", "type": "*variable", "value": "~*req.8"},
-// {"tag": "RouteRateProfileIDs", "path": "Routes.RateProfileIDs", "type": "*variable", "value": "~*req.9"},
-// {"tag": "RouteResourceIDs", "path": "Routes.ResourceIDs", "type": "*variable", "value": "~*req.10"},
-// {"tag": "RouteStatIDs", "path": "Routes.StatIDs", "type": "*variable", "value": "~*req.11"},
-// {"tag": "RouteWeights", "path": "Routes.Weights", "type": "*variable", "value": "~*req.12"},
-// {"tag": "RouteBlocker", "path": "Routes.Blocker", "type": "*variable", "value": "~*req.13"},
-// {"tag": "RouteParameters", "path": "Routes.RouteParameters", "type": "*variable", "value": "~*req.14"},
+// {"tag": "Blockers", "path": "Blockers", "type": "*variable", "value": "~*req.6"},
+// {"tag": "RouteID", "path": "Routes.ID", "type": "*variable", "value": "~*req.7","new_branch":true},
+// {"tag": "RouteFilterIDs", "path": "Routes.FilterIDs", "type": "*variable", "value": "~*req.8"},
+// {"tag": "RouteAccountIDs", "path": "Routes.AccountIDs", "type": "*variable", "value": "~*req.9"},
+// {"tag": "RouteRateProfileIDs", "path": "Routes.RateProfileIDs", "type": "*variable", "value": "~*req.10"},
+// {"tag": "RouteResourceIDs", "path": "Routes.ResourceIDs", "type": "*variable", "value": "~*req.11"},
+// {"tag": "RouteStatIDs", "path": "Routes.StatIDs", "type": "*variable", "value": "~*req.12"},
+// {"tag": "RouteWeights", "path": "Routes.Weights", "type": "*variable", "value": "~*req.13"},
+// {"tag": "RouteBlocker", "path": "Routes.Blocker", "type": "*variable", "value": "~*req.14"},
+// {"tag": "RouteParameters", "path": "Routes.RouteParameters", "type": "*variable", "value": "~*req.15"},
// ],
// },
// {
diff --git a/data/conf/samples/routes_mysql/cgrates.json b/data/conf/samples/routes_mysql/cgrates.json
index e3f57077b..7c4b758f9 100644
--- a/data/conf/samples/routes_mysql/cgrates.json
+++ b/data/conf/samples/routes_mysql/cgrates.json
@@ -1,118 +1,31 @@
{
-// CGRateS Configuration file
-//
+
+ "general": {
+ "log_level": 7,
+ "reply_timeout": "50s"
+ },
-"general": {
- "log_level": 7,
- "reply_timeout": "50s",
-},
+ "listen": {
+ "rpc_json": ":2012",
+ "rpc_gob": ":2013",
+ "http": ":2080"
+ },
+ "data_db": {
+ "db_type": "redis",
+ "db_port": 6379,
+ "db_name": "10"
+ },
-"listen": {
- "rpc_json": ":2012",
- "rpc_gob": ":2013",
- "http": ":2080",
-},
+ "routes": {
+ "enabled": true
+ },
-"data_db": { // database used to store runtime data (eg: accounts, cdr stats)
- "db_type": "redis", // data_db type:
- "db_port": 6379, // data_db port to reach the database
- "db_name": "10", // data_db database name to connect to
-},
-
-
-
-"cdrs": {
- "enabled": true,
- "chargers_conns":["*internal"],
-},
-
-
-"attributes": {
- "enabled": true,
- "stats_conns": ["*localhost"],
- "resources_conns": ["*localhost"],
- "accounts_conns": ["*localhost"]
-},
-
-"chargers": {
- "enabled": true,
- "attributes_conns": ["*internal"],
-},
-
-
-"resources": {
- "enabled": true,
- "store_interval": "1s",
- "thresholds_conns": ["*internal"]
-},
-
-
-"stats": {
- "enabled": true,
- "store_interval": "1s",
- "thresholds_conns": ["*internal"],
-},
-
-
-"thresholds": {
- "enabled": true,
- "store_interval": "1s",
-},
-
-
-"routes": {
- "enabled": true,
- "prefix_indexed_fields":["*req.Destination"],
- "stats_conns": ["*internal"],
- "resources_conns": ["*internal"],
- "rates_conns": ["*internal"],
-},
-
-
-"sessions": {
- "enabled": true,
- "routes_conns": ["*internal"],
- "resources_conns": ["*internal"],
- "attributes_conns": ["*internal"],
- "rates_conns": ["*internal"],
- "cdrs_conns": ["*internal"],
- "chargers_conns": ["*internal"],
-},
-
-
-"migrator":{
- "users_filters":["Account"],
-},
-
-
-"admins": {
- "enabled": true,
-},
-
-
-"rates": {
- "enabled": true
-},
-
-
-"actions": {
- "enabled": true,
- "accounts_conns": ["*localhost"]
-},
-
-
-"accounts": {
- "enabled": true
-},
-
-
-"filters": {
- "stats_conns": ["*internal"],
- "resources_conns": ["*internal"],
- "accounts_conns": ["*internal"],
-},
+ "admins": {
+ "enabled": true,
+ "scheduler_conns": ["*internal"]
+ }
}
diff --git a/data/tariffplans/cluelrn/Routes.csv b/data/tariffplans/cluelrn/Routes.csv
index c4b1e0661..7f088a0e4 100644
--- a/data/tariffplans/cluelrn/Routes.csv
+++ b/data/tariffplans/cluelrn/Routes.csv
@@ -1,4 +1,4 @@
-#Tenant,ID,FilterIDs,Weights,Sorting,SortingParameters,RouteID,RouteFilterIDs,RouteAccountIDs,RouteRateProfileIDs,RouteResourceIDs,RouteStatIDs,RouteWeights,RouteBlocker,RouteParameters
-cgrates.org,ROUTE_CLUELRN_INTER,*string:~*req.Account:9174269000;*string:~*req.LRNJurisdiction:INTER,;10,*lc,,LEVEL3,,,RP_LEVEL3_INTER,,,,false,
-cgrates.org,ROUTE_CLUELRN_INTER,,,,,TMOBILE,,,RP_TMOBILE_INTER,,,,false,
-cgrates.org,ROUTE_CLUELRN_INTER,,,,,COMCAST,,,RP_COMCAST_INTER,,,,false,
+#Tenant,ID,FilterIDs,Weights,Sorting,SortingParameters,Blockers,RouteID,RouteFilterIDs,RouteAccountIDs,RouteRateProfileIDs,RouteResourceIDs,RouteStatIDs,RouteWeights,RouteBlocker,RouteParameters
+cgrates.org,ROUTE_CLUELRN_INTER,*string:~*req.Account:9174269000;*string:~*req.LRNJurisdiction:INTER,;10,*lc,,,LEVEL3,,,RP_LEVEL3_INTER,,,,false,
+cgrates.org,ROUTE_CLUELRN_INTER,,,,,,TMOBILE,,,RP_TMOBILE_INTER,,,,false,
+cgrates.org,ROUTE_CLUELRN_INTER,,,,,,COMCAST,,,RP_COMCAST_INTER,,,,false,
diff --git a/data/tariffplans/dnsagent/Routes.csv b/data/tariffplans/dnsagent/Routes.csv
index 73eeebd61..242f3088b 100644
--- a/data/tariffplans/dnsagent/Routes.csv
+++ b/data/tariffplans/dnsagent/Routes.csv
@@ -1,4 +1,4 @@
-#Tenant,ID,FilterIDs,Weights,Sorting,SortingParameters,RouteID,RouteFilterIDs,RouteAccountIDs,RouteRateProfileIDs,RouteResourceIDs,RouteStatIDs,RouteWeights,RouteBlocker,RouteParameters
-cgrates.org,ROUTE_ACNT_1001,*string:~*req.Account:1001,;10,*weight,,route1,,,,,,;10,,!^(.*)$!sip:\1@172.16.1.11!
-cgrates.org,ROUTE_ACNT_1001,,;10,,,route2,,,,,,;5,,!^(.*)$!sip:\1@172.16.1.12!
+#Tenant,ID,FilterIDs,Weights,Sorting,SortingParameters,Blockers,RouteID,RouteFilterIDs,RouteAccountIDs,RouteRateProfileIDs,RouteResourceIDs,RouteStatIDs,RouteWeights,RouteBlocker,RouteParameters
+cgrates.org,ROUTE_ACNT_1001,*string:~*req.Account:1001,;10,*weight,,,route1,,,,,,;10,,!^(.*)$!sip:\1@172.16.1.11!
+cgrates.org,ROUTE_ACNT_1001,,;10,,,,route2,,,,,,;5,,!^(.*)$!sip:\1@172.16.1.12!
diff --git a/data/tariffplans/loadRateTest/Routes.csv b/data/tariffplans/loadRateTest/Routes.csv
index 271045f0a..3e9f7d57f 100644
--- a/data/tariffplans/loadRateTest/Routes.csv
+++ b/data/tariffplans/loadRateTest/Routes.csv
@@ -1,33 +1,33 @@
-#Tenant,ID,FilterIDs,Weights,Sorting,SortingParameters,RouteID,RouteFilterIDs,RouteAccountIDs,RouteRateProfileIDs,RouteResourceIDs,RouteStatIDs,RouteWeights,RouteBlocker,RouteParameters
-cgrates.org,ROUTE_ACNT_1001,FLTR_ACCOUNT_1001,;10,*weight,,route1,,,,,,;20,,
-cgrates.org,ROUTE_ACNT_1001,,,,,route2,,,,,,;10,,
-cgrates.org,ROUTE_WEIGHT_2,,;5,*weight,,route1,,,,,,;10,,
-cgrates.org,ROUTE_WEIGHT_1,FLTR_DST_DE;FLTR_ACNT_1007,;10,*weight,,route1,,,,,,;10,,
-cgrates.org,ROUTE_WEIGHT_1,FLTR_DST_DE,,,,route2,,,,,,;20,,
-cgrates.org,ROUTE_WEIGHT_1,FLTR_ACNT_1007,,,,route3,FLTR_SPP_ACNT_dan,,,,,;15,,
-cgrates.org,ROUTE_LEASTCOST_1,FLTR_1,;10,*lc,,route1,,,RP_SPECIAL_1002,,,;10,false,
-cgrates.org,ROUTE_LEASTCOST_1,,,,,route2,,,RP_RETAIL1,,,;20,,
-cgrates.org,ROUTE_LEASTCOST_1,,,,,route3,,,RP_SPECIAL_1002,,,;15,,
-cgrates.org,ROUTE_HIGHESTCOST_1,FLTR_SPP_2,;20,*hc,,route1,,,RP_SPECIAL_1002,,,;10,false,
-cgrates.org,ROUTE_HIGHESTCOST_1,,,,,route2,,,RP_RETAIL1,,,;20,,
-cgrates.org,ROUTE_HIGHESTCOST_1,,,,,route3,,,RP_SPECIAL_1002,,,;15,,
-cgrates.org,ROUTE_QOS_1,FLTR_SPP_3,;20,*qos,*acd;*tcd;*asr,route1,,,,,Stat_1;Stat_1_1,;10,false,
-cgrates.org,ROUTE_QOS_1,,,,,route2,,,,,Stat_2,;20,,
-cgrates.org,ROUTE_QOS_1,,,,,route3,,,,,Stat_3,;35,,
-cgrates.org,ROUTE_QOS_2,FLTR_SPP_4,;20,*qos,*dcc,route1,,,,,Stat_1;Stat_1_1,;10,false,
-cgrates.org,ROUTE_QOS_2,,,,,route2,,,,,Stat_2,;20,,
-cgrates.org,ROUTE_QOS_2,,,,,route3,,,,,Stat_3,;35,,
-cgrates.org,ROUTE_QOS_3,FLTR_SPP_5,;20,*qos,*pdd,route1,,,,,Stat_1;Stat_1_1,;10,false,
-cgrates.org,ROUTE_QOS_3,,,,,route2,,,,,Stat_2,;20,,
-cgrates.org,ROUTE_QOS_3,,,,,route3,,,,,Stat_3,;35,,
-cgrates.org,ROUTE_QOS_FILTRED,FLTR_SPP_6,;20,*qos,*pdd,route1,FLTR_QOS_SP1,,,,Stat_1;Stat_1_1,;10,false,
-cgrates.org,ROUTE_QOS_FILTRED,,,,,route2,FLTR_QOS_SP2,,,,Stat_2,;20,,
-cgrates.org,ROUTE_QOS_FILTRED,,,,,route3,,,,,Stat_3,;35,,
-cgrates.org,ROUTE_QOS_FILTRED2,FLTR_SPP_QOS_2,;20,*qos,*acd;*tcd;*asr,route1,FLTR_QOS_SP1_2,,RP_SPECIAL_1002,,Stat_1;Stat_1_1,;10,false,
-cgrates.org,ROUTE_QOS_FILTRED2,,,,,route2,FLTR_QOS_SP2_2,,RP_RETAIL1,,Stat_2,;20,,
-cgrates.org,ROUTE_QOS_FILTRED2,,,,,route3,,,,,Stat_3,;35,,
-cgrates.org,ROUTE_LCR,FLTR_TEST,;50,*lc,,route_1,,,RP_TEST_1,,,;10,,
-cgrates.org,ROUTE_LCR,,,,,route_2,,,RP_TEST_2,,,,,
-cgrates.org,ROUTE_LOAD_DIST,FLTR_SPP_LOAD_DIST,;20,*load,route1:2;route2:7;*default:5,route1,,,,,Stat_Supplier1:*sum#~*req.LoadReq,;10,false,
-cgrates.org,ROUTE_LOAD_DIST,,,,,route2,,,,,Stat_Supplier2:*sum#~*req.LoadReq,;20,,
-cgrates.org,ROUTE_LOAD_DIST,,,,,route3,,,,,Stat_Supplier3:*sum#~*req.LoadReq,;35,,
\ No newline at end of file
+#Tenant,ID,FilterIDs,Weights,Sorting,SortingParameters,Blockers,RouteID,RouteFilterIDs,RouteAccountIDs,RouteRateProfileIDs,RouteResourceIDs,RouteStatIDs,RouteWeights,RouteBlocker,RouteParameters
+cgrates.org,ROUTE_ACNT_1001,FLTR_ACCOUNT_1001,;10,*weight,,,route1,,,,,,;20,,
+cgrates.org,ROUTE_ACNT_1001,,,,,,route2,,,,,,;10,,
+cgrates.org,ROUTE_WEIGHT_2,,;5,*weight,,,route1,,,,,,;10,,
+cgrates.org,ROUTE_WEIGHT_1,FLTR_DST_DE;FLTR_ACNT_1007,;10,*weight,,,route1,,,,,,;10,,
+cgrates.org,ROUTE_WEIGHT_1,FLTR_DST_DE,,,,,route2,,,,,,;20,,
+cgrates.org,ROUTE_WEIGHT_1,FLTR_ACNT_1007,,,,,route3,FLTR_SPP_ACNT_dan,,,,,;15,,
+cgrates.org,ROUTE_LEASTCOST_1,FLTR_1,;10,*lc,,,route1,,,RP_SPECIAL_1002,,,;10,false,
+cgrates.org,ROUTE_LEASTCOST_1,,,,,,route2,,,RP_RETAIL1,,,;20,,
+cgrates.org,ROUTE_LEASTCOST_1,,,,,,route3,,,RP_SPECIAL_1002,,,;15,,
+cgrates.org,ROUTE_HIGHESTCOST_1,FLTR_SPP_2,;20,*hc,,,route1,,,RP_SPECIAL_1002,,,;10,false,
+cgrates.org,ROUTE_HIGHESTCOST_1,,,,,,route2,,,RP_RETAIL1,,,;20,,
+cgrates.org,ROUTE_HIGHESTCOST_1,,,,,,route3,,,RP_SPECIAL_1002,,,;15,,
+cgrates.org,ROUTE_QOS_1,FLTR_SPP_3,;20,*qos,*acd;*tcd;*asr,,route1,,,,,Stat_1;Stat_1_1,;10,false,
+cgrates.org,ROUTE_QOS_1,,,,,,route2,,,,,Stat_2,;20,,
+cgrates.org,ROUTE_QOS_1,,,,,,route3,,,,,Stat_3,;35,,
+cgrates.org,ROUTE_QOS_2,FLTR_SPP_4,;20,*qos,*dcc,,route1,,,,,Stat_1;Stat_1_1,;10,false,
+cgrates.org,ROUTE_QOS_2,,,,,,route2,,,,,Stat_2,;20,,
+cgrates.org,ROUTE_QOS_2,,,,,,route3,,,,,Stat_3,;35,,
+cgrates.org,ROUTE_QOS_3,FLTR_SPP_5,;20,*qos,*pdd,,route1,,,,,Stat_1;Stat_1_1,;10,false,
+cgrates.org,ROUTE_QOS_3,,,,,,route2,,,,,Stat_2,;20,,
+cgrates.org,ROUTE_QOS_3,,,,,,route3,,,,,Stat_3,;35,,
+cgrates.org,ROUTE_QOS_FILTRED,FLTR_SPP_6,;20,*qos,*pdd,,route1,FLTR_QOS_SP1,,,,Stat_1;Stat_1_1,;10,false,
+cgrates.org,ROUTE_QOS_FILTRED,,,,,,route2,FLTR_QOS_SP2,,,,Stat_2,;20,,
+cgrates.org,ROUTE_QOS_FILTRED,,,,,,route3,,,,,Stat_3,;35,,
+cgrates.org,ROUTE_QOS_FILTRED2,FLTR_SPP_QOS_2,;20,*qos,*acd;*tcd;*asr,,route1,FLTR_QOS_SP1_2,,RP_SPECIAL_1002,,Stat_1;Stat_1_1,;10,false,
+cgrates.org,ROUTE_QOS_FILTRED2,,,,,,route2,FLTR_QOS_SP2_2,,RP_RETAIL1,,Stat_2,;20,,
+cgrates.org,ROUTE_QOS_FILTRED2,,,,,,route3,,,,,Stat_3,;35,,
+cgrates.org,ROUTE_LCR,FLTR_TEST,;50,*lc,,,route_1,,,RP_TEST_1,,,;10,,
+cgrates.org,ROUTE_LCR,,,,,,route_2,,,RP_TEST_2,,,,,
+cgrates.org,ROUTE_LOAD_DIST,FLTR_SPP_LOAD_DIST,;20,*load,route1:2;route2:7;*default:5,,route1,,,,,Stat_Supplier1:*sum#~*req.LoadReq,;10,false,
+cgrates.org,ROUTE_LOAD_DIST,,,,,,route2,,,,,Stat_Supplier2:*sum#~*req.LoadReq,;20,,
+cgrates.org,ROUTE_LOAD_DIST,,,,,,route3,,,,,Stat_Supplier3:*sum#~*req.LoadReq,;35,,
\ No newline at end of file
diff --git a/data/tariffplans/oldtutorial/Routes.csv b/data/tariffplans/oldtutorial/Routes.csv
index f8d57f1b5..3b9555f62 100644
--- a/data/tariffplans/oldtutorial/Routes.csv
+++ b/data/tariffplans/oldtutorial/Routes.csv
@@ -1,8 +1,8 @@
-#Tenant,ID,FilterIDs,Weights,Sorting,SortingParameters,RouteID,RouteFilterIDs,RouteAccountIDs,RouteRateProfileIDs,RouteResourceIDs,RouteStatIDs,RouteWeights,RouteBlocker,RouteParameters
-cgrates.org,ROUTE_WEIGHT_2,,;5,*weight,,route1,,,,,,;10,,
-cgrates.org,ROUTE_WEIGHT_1,FLTR_DST_DE;FLTR_ACNT_1007,;10,*weight,,route1,,,,,,;10,,
-cgrates.org,ROUTE_WEIGHT_1,FLTR_DST_DE,,,,route2,,,,,,;20,,
-cgrates.org,ROUTE_WEIGHT_1,FLTR_ACNT_1007,,,,route3,FLTR_ACNT_dan,,,,,;15,,
-cgrates.org,ROUTE_LEASTCOST_1,FLTR_1,;10,*lc,,route1,,,RP_SPECIAL_1002,,,;10,false,
-cgrates.org,ROUTE_LEASTCOST_1,,,,,route2,,,RP_RETAIL1,,,;20,,
-cgrates.org,ROUTE_LEASTCOST_1,,,,,route3,,,RP_SPECIAL_1002,,,;15,,
+#Tenant,ID,FilterIDs,Weights,Sorting,SortingParameters,Blockers,RouteID,RouteFilterIDs,RouteAccountIDs,RouteRateProfileIDs,RouteResourceIDs,RouteStatIDs,RouteWeights,RouteBlocker,RouteParameters
+cgrates.org,ROUTE_WEIGHT_2,,;5,*weight,,,route1,,,,,,;10,,
+cgrates.org,ROUTE_WEIGHT_1,FLTR_DST_DE;FLTR_ACNT_1007,;10,*weight,,,route1,,,,,,;10,,
+cgrates.org,ROUTE_WEIGHT_1,FLTR_DST_DE,,,,,route2,,,,,,;20,,
+cgrates.org,ROUTE_WEIGHT_1,FLTR_ACNT_1007,,,,,route3,FLTR_ACNT_dan,,,,,;15,,
+cgrates.org,ROUTE_LEASTCOST_1,FLTR_1,;10,*lc,,,route1,,,RP_SPECIAL_1002,,,;10,false,
+cgrates.org,ROUTE_LEASTCOST_1,,,,,,route2,,,RP_RETAIL1,,,;20,,
+cgrates.org,ROUTE_LEASTCOST_1,,,,,,route3,,,RP_SPECIAL_1002,,,;15,,
diff --git a/data/tariffplans/precache/Routes.csv b/data/tariffplans/precache/Routes.csv
index f8d57f1b5..3b9555f62 100644
--- a/data/tariffplans/precache/Routes.csv
+++ b/data/tariffplans/precache/Routes.csv
@@ -1,8 +1,8 @@
-#Tenant,ID,FilterIDs,Weights,Sorting,SortingParameters,RouteID,RouteFilterIDs,RouteAccountIDs,RouteRateProfileIDs,RouteResourceIDs,RouteStatIDs,RouteWeights,RouteBlocker,RouteParameters
-cgrates.org,ROUTE_WEIGHT_2,,;5,*weight,,route1,,,,,,;10,,
-cgrates.org,ROUTE_WEIGHT_1,FLTR_DST_DE;FLTR_ACNT_1007,;10,*weight,,route1,,,,,,;10,,
-cgrates.org,ROUTE_WEIGHT_1,FLTR_DST_DE,,,,route2,,,,,,;20,,
-cgrates.org,ROUTE_WEIGHT_1,FLTR_ACNT_1007,,,,route3,FLTR_ACNT_dan,,,,,;15,,
-cgrates.org,ROUTE_LEASTCOST_1,FLTR_1,;10,*lc,,route1,,,RP_SPECIAL_1002,,,;10,false,
-cgrates.org,ROUTE_LEASTCOST_1,,,,,route2,,,RP_RETAIL1,,,;20,,
-cgrates.org,ROUTE_LEASTCOST_1,,,,,route3,,,RP_SPECIAL_1002,,,;15,,
+#Tenant,ID,FilterIDs,Weights,Sorting,SortingParameters,Blockers,RouteID,RouteFilterIDs,RouteAccountIDs,RouteRateProfileIDs,RouteResourceIDs,RouteStatIDs,RouteWeights,RouteBlocker,RouteParameters
+cgrates.org,ROUTE_WEIGHT_2,,;5,*weight,,,route1,,,,,,;10,,
+cgrates.org,ROUTE_WEIGHT_1,FLTR_DST_DE;FLTR_ACNT_1007,;10,*weight,,,route1,,,,,,;10,,
+cgrates.org,ROUTE_WEIGHT_1,FLTR_DST_DE,,,,,route2,,,,,,;20,,
+cgrates.org,ROUTE_WEIGHT_1,FLTR_ACNT_1007,,,,,route3,FLTR_ACNT_dan,,,,,;15,,
+cgrates.org,ROUTE_LEASTCOST_1,FLTR_1,;10,*lc,,,route1,,,RP_SPECIAL_1002,,,;10,false,
+cgrates.org,ROUTE_LEASTCOST_1,,,,,,route2,,,RP_RETAIL1,,,;20,,
+cgrates.org,ROUTE_LEASTCOST_1,,,,,,route3,,,RP_SPECIAL_1002,,,;15,,
diff --git a/data/tariffplans/sessions_discount_volume/routes1/Routes.csv b/data/tariffplans/sessions_discount_volume/routes1/Routes.csv
index 2a1210700..62c012833 100644
--- a/data/tariffplans/sessions_discount_volume/routes1/Routes.csv
+++ b/data/tariffplans/sessions_discount_volume/routes1/Routes.csv
@@ -1,8 +1,8 @@
-#Tenant,ID,FilterIDs,Weight,Sorting,SortingParameters,RouteID,RouteFilterIDs,RouteAccountIDs,RouteRateProfileIDs,RouteResourceIDs,RouteStatIDs,RouteWeight,RouteBlocker,RouteParameters
+#Tenant,ID,FilterIDs,Weight,Sorting,SortingParameters,Blockers,RouteID,RouteFilterIDs,RouteAccountIDs,RouteRateProfileIDs,RouteResourceIDs,RouteStatIDs,RouteWeight,RouteBlocker,RouteParameters
-cgrates.org,LC1,,,*lc,,,,,,,,,,
-cgrates.org,LC1,,,,,supplier1,,ACNT_VOL1,,,,,,
-cgrates.org,LC1,,,,,supplier2,,,RP_SUPPLIER2,,,,,
-cgrates.org,LC1,,,,,supplier3,,,RP_SUPPLIER3,,,,,
-cgrates.org,LC1,,,,,supplier4,,,RP_SUPPLIER4,,,,,
+cgrates.org,LC1,,,*lc,,,,,,,,,,,
+cgrates.org,LC1,,,,,,supplier1,,ACNT_VOL1,,,,,,
+cgrates.org,LC1,,,,,,supplier2,,,RP_SUPPLIER2,,,,,
+cgrates.org,LC1,,,,,,supplier3,,,RP_SUPPLIER3,,,,,
+cgrates.org,LC1,,,,,,supplier4,,,RP_SUPPLIER4,,,,,
diff --git a/data/tariffplans/testit/Routes.csv b/data/tariffplans/testit/Routes.csv
index 271045f0a..3e9f7d57f 100644
--- a/data/tariffplans/testit/Routes.csv
+++ b/data/tariffplans/testit/Routes.csv
@@ -1,33 +1,33 @@
-#Tenant,ID,FilterIDs,Weights,Sorting,SortingParameters,RouteID,RouteFilterIDs,RouteAccountIDs,RouteRateProfileIDs,RouteResourceIDs,RouteStatIDs,RouteWeights,RouteBlocker,RouteParameters
-cgrates.org,ROUTE_ACNT_1001,FLTR_ACCOUNT_1001,;10,*weight,,route1,,,,,,;20,,
-cgrates.org,ROUTE_ACNT_1001,,,,,route2,,,,,,;10,,
-cgrates.org,ROUTE_WEIGHT_2,,;5,*weight,,route1,,,,,,;10,,
-cgrates.org,ROUTE_WEIGHT_1,FLTR_DST_DE;FLTR_ACNT_1007,;10,*weight,,route1,,,,,,;10,,
-cgrates.org,ROUTE_WEIGHT_1,FLTR_DST_DE,,,,route2,,,,,,;20,,
-cgrates.org,ROUTE_WEIGHT_1,FLTR_ACNT_1007,,,,route3,FLTR_SPP_ACNT_dan,,,,,;15,,
-cgrates.org,ROUTE_LEASTCOST_1,FLTR_1,;10,*lc,,route1,,,RP_SPECIAL_1002,,,;10,false,
-cgrates.org,ROUTE_LEASTCOST_1,,,,,route2,,,RP_RETAIL1,,,;20,,
-cgrates.org,ROUTE_LEASTCOST_1,,,,,route3,,,RP_SPECIAL_1002,,,;15,,
-cgrates.org,ROUTE_HIGHESTCOST_1,FLTR_SPP_2,;20,*hc,,route1,,,RP_SPECIAL_1002,,,;10,false,
-cgrates.org,ROUTE_HIGHESTCOST_1,,,,,route2,,,RP_RETAIL1,,,;20,,
-cgrates.org,ROUTE_HIGHESTCOST_1,,,,,route3,,,RP_SPECIAL_1002,,,;15,,
-cgrates.org,ROUTE_QOS_1,FLTR_SPP_3,;20,*qos,*acd;*tcd;*asr,route1,,,,,Stat_1;Stat_1_1,;10,false,
-cgrates.org,ROUTE_QOS_1,,,,,route2,,,,,Stat_2,;20,,
-cgrates.org,ROUTE_QOS_1,,,,,route3,,,,,Stat_3,;35,,
-cgrates.org,ROUTE_QOS_2,FLTR_SPP_4,;20,*qos,*dcc,route1,,,,,Stat_1;Stat_1_1,;10,false,
-cgrates.org,ROUTE_QOS_2,,,,,route2,,,,,Stat_2,;20,,
-cgrates.org,ROUTE_QOS_2,,,,,route3,,,,,Stat_3,;35,,
-cgrates.org,ROUTE_QOS_3,FLTR_SPP_5,;20,*qos,*pdd,route1,,,,,Stat_1;Stat_1_1,;10,false,
-cgrates.org,ROUTE_QOS_3,,,,,route2,,,,,Stat_2,;20,,
-cgrates.org,ROUTE_QOS_3,,,,,route3,,,,,Stat_3,;35,,
-cgrates.org,ROUTE_QOS_FILTRED,FLTR_SPP_6,;20,*qos,*pdd,route1,FLTR_QOS_SP1,,,,Stat_1;Stat_1_1,;10,false,
-cgrates.org,ROUTE_QOS_FILTRED,,,,,route2,FLTR_QOS_SP2,,,,Stat_2,;20,,
-cgrates.org,ROUTE_QOS_FILTRED,,,,,route3,,,,,Stat_3,;35,,
-cgrates.org,ROUTE_QOS_FILTRED2,FLTR_SPP_QOS_2,;20,*qos,*acd;*tcd;*asr,route1,FLTR_QOS_SP1_2,,RP_SPECIAL_1002,,Stat_1;Stat_1_1,;10,false,
-cgrates.org,ROUTE_QOS_FILTRED2,,,,,route2,FLTR_QOS_SP2_2,,RP_RETAIL1,,Stat_2,;20,,
-cgrates.org,ROUTE_QOS_FILTRED2,,,,,route3,,,,,Stat_3,;35,,
-cgrates.org,ROUTE_LCR,FLTR_TEST,;50,*lc,,route_1,,,RP_TEST_1,,,;10,,
-cgrates.org,ROUTE_LCR,,,,,route_2,,,RP_TEST_2,,,,,
-cgrates.org,ROUTE_LOAD_DIST,FLTR_SPP_LOAD_DIST,;20,*load,route1:2;route2:7;*default:5,route1,,,,,Stat_Supplier1:*sum#~*req.LoadReq,;10,false,
-cgrates.org,ROUTE_LOAD_DIST,,,,,route2,,,,,Stat_Supplier2:*sum#~*req.LoadReq,;20,,
-cgrates.org,ROUTE_LOAD_DIST,,,,,route3,,,,,Stat_Supplier3:*sum#~*req.LoadReq,;35,,
\ No newline at end of file
+#Tenant,ID,FilterIDs,Weights,Sorting,SortingParameters,Blockers,RouteID,RouteFilterIDs,RouteAccountIDs,RouteRateProfileIDs,RouteResourceIDs,RouteStatIDs,RouteWeights,RouteBlocker,RouteParameters
+cgrates.org,ROUTE_ACNT_1001,FLTR_ACCOUNT_1001,;10,*weight,,,route1,,,,,,;20,,
+cgrates.org,ROUTE_ACNT_1001,,,,,,route2,,,,,,;10,,
+cgrates.org,ROUTE_WEIGHT_2,,;5,*weight,,,route1,,,,,,;10,,
+cgrates.org,ROUTE_WEIGHT_1,FLTR_DST_DE;FLTR_ACNT_1007,;10,*weight,,,route1,,,,,,;10,,
+cgrates.org,ROUTE_WEIGHT_1,FLTR_DST_DE,,,,,route2,,,,,,;20,,
+cgrates.org,ROUTE_WEIGHT_1,FLTR_ACNT_1007,,,,,route3,FLTR_SPP_ACNT_dan,,,,,;15,,
+cgrates.org,ROUTE_LEASTCOST_1,FLTR_1,;10,*lc,,,route1,,,RP_SPECIAL_1002,,,;10,false,
+cgrates.org,ROUTE_LEASTCOST_1,,,,,,route2,,,RP_RETAIL1,,,;20,,
+cgrates.org,ROUTE_LEASTCOST_1,,,,,,route3,,,RP_SPECIAL_1002,,,;15,,
+cgrates.org,ROUTE_HIGHESTCOST_1,FLTR_SPP_2,;20,*hc,,,route1,,,RP_SPECIAL_1002,,,;10,false,
+cgrates.org,ROUTE_HIGHESTCOST_1,,,,,,route2,,,RP_RETAIL1,,,;20,,
+cgrates.org,ROUTE_HIGHESTCOST_1,,,,,,route3,,,RP_SPECIAL_1002,,,;15,,
+cgrates.org,ROUTE_QOS_1,FLTR_SPP_3,;20,*qos,*acd;*tcd;*asr,,route1,,,,,Stat_1;Stat_1_1,;10,false,
+cgrates.org,ROUTE_QOS_1,,,,,,route2,,,,,Stat_2,;20,,
+cgrates.org,ROUTE_QOS_1,,,,,,route3,,,,,Stat_3,;35,,
+cgrates.org,ROUTE_QOS_2,FLTR_SPP_4,;20,*qos,*dcc,,route1,,,,,Stat_1;Stat_1_1,;10,false,
+cgrates.org,ROUTE_QOS_2,,,,,,route2,,,,,Stat_2,;20,,
+cgrates.org,ROUTE_QOS_2,,,,,,route3,,,,,Stat_3,;35,,
+cgrates.org,ROUTE_QOS_3,FLTR_SPP_5,;20,*qos,*pdd,,route1,,,,,Stat_1;Stat_1_1,;10,false,
+cgrates.org,ROUTE_QOS_3,,,,,,route2,,,,,Stat_2,;20,,
+cgrates.org,ROUTE_QOS_3,,,,,,route3,,,,,Stat_3,;35,,
+cgrates.org,ROUTE_QOS_FILTRED,FLTR_SPP_6,;20,*qos,*pdd,,route1,FLTR_QOS_SP1,,,,Stat_1;Stat_1_1,;10,false,
+cgrates.org,ROUTE_QOS_FILTRED,,,,,,route2,FLTR_QOS_SP2,,,,Stat_2,;20,,
+cgrates.org,ROUTE_QOS_FILTRED,,,,,,route3,,,,,Stat_3,;35,,
+cgrates.org,ROUTE_QOS_FILTRED2,FLTR_SPP_QOS_2,;20,*qos,*acd;*tcd;*asr,,route1,FLTR_QOS_SP1_2,,RP_SPECIAL_1002,,Stat_1;Stat_1_1,;10,false,
+cgrates.org,ROUTE_QOS_FILTRED2,,,,,,route2,FLTR_QOS_SP2_2,,RP_RETAIL1,,Stat_2,;20,,
+cgrates.org,ROUTE_QOS_FILTRED2,,,,,,route3,,,,,Stat_3,;35,,
+cgrates.org,ROUTE_LCR,FLTR_TEST,;50,*lc,,,route_1,,,RP_TEST_1,,,;10,,
+cgrates.org,ROUTE_LCR,,,,,,route_2,,,RP_TEST_2,,,,,
+cgrates.org,ROUTE_LOAD_DIST,FLTR_SPP_LOAD_DIST,;20,*load,route1:2;route2:7;*default:5,,route1,,,,,Stat_Supplier1:*sum#~*req.LoadReq,;10,false,
+cgrates.org,ROUTE_LOAD_DIST,,,,,,route2,,,,,Stat_Supplier2:*sum#~*req.LoadReq,;20,,
+cgrates.org,ROUTE_LOAD_DIST,,,,,,route3,,,,,Stat_Supplier3:*sum#~*req.LoadReq,;35,,
\ No newline at end of file
diff --git a/data/tariffplans/testtp/Routes.csv b/data/tariffplans/testtp/Routes.csv
index 1d7bc2f79..15f472786 100644
--- a/data/tariffplans/testtp/Routes.csv
+++ b/data/tariffplans/testtp/Routes.csv
@@ -1,5 +1,5 @@
-#Tenant,ID,FilterIDs,Weights,Sorting,SortingParameters,RouteID,RouteFilterIDs,RouteAccountIDs,RouteRateProfileIDs,RouteResourceIDs,RouteStatIDs,RouteWeights,RouteBlocker,RouteParameters
-cgrates.org,ROUTE_1,FLTR_ACNT_dan;FLTR_DST_DE,;10,*lc,,route1,FLTR_ACNT_dan,,RPL_1,ResGroup1,Stat1,;10,false,SortingParameter1
-cgrates.org,ROUTE_WEIGHT_1,FLTR_DST_DE;FLTR_ACNT_1007,;10,*weight,,route1,,,,,,;10,,
-cgrates.org,ROUTE_WEIGHT_1,FLTR_DST_DE,,,,route2,,,,,,;20,,
-cgrates.org,ROUTE_WEIGHT_1,FLTR_ACNT_1007,,,,route3,FLTR_ACNT_dan,,,,,;15,,
+#Tenant,ID,FilterIDs,Weights,Sorting,SortingParameters,Blockers,RouteID,RouteFilterIDs,RouteAccountIDs,RouteRateProfileIDs,RouteResourceIDs,RouteStatIDs,RouteWeights,RouteBlocker,RouteParameters
+cgrates.org,ROUTE_1,FLTR_ACNT_dan;FLTR_DST_DE,;10,*lc,,,route1,FLTR_ACNT_dan,,RPL_1,ResGroup1,Stat1,;10,false,SortingParameter1
+cgrates.org,ROUTE_WEIGHT_1,FLTR_DST_DE;FLTR_ACNT_1007,;10,*weight,,,route1,,,,,,;10,,
+cgrates.org,ROUTE_WEIGHT_1,FLTR_DST_DE,,,,,route2,,,,,,;20,,
+cgrates.org,ROUTE_WEIGHT_1,FLTR_ACNT_1007,,,,,route3,FLTR_ACNT_dan,,,,,;15,,
diff --git a/data/tariffplans/tut_sip_redirect/Routes.csv b/data/tariffplans/tut_sip_redirect/Routes.csv
index a20cbf733..6ea3e76bc 100644
--- a/data/tariffplans/tut_sip_redirect/Routes.csv
+++ b/data/tariffplans/tut_sip_redirect/Routes.csv
@@ -1,7 +1,7 @@
-#Tenant,ID,FilterIDs,Weights,Sorting,SortingParameters,RouteID,RouteFilterIDs,RouteAccountIDs,RouteRateProfileIDs,RouteResourceIDs,RouteStatIDs,RouteWeights,RouteBlocker,RouteParameters
-cgrates.org,ROUTE_ACNT_1001,*string:~*req.Account:1001,;20,*weight,,route1,,1001,RP_10CNT,,,;20,,cgrates.org
-cgrates.org,ROUTE_ACNT_1001,,;10,,,route2,,1001,RP_20CNT,,,;10,,cgrates.net
-cgrates.org,ROUTE_ACNT_1001,,;5,,,route3,,1001,RP_1CNT,,,;5,,cgrates.com
-cgrates.org,ROUTE_ACNT_1002,*string:~*req.Account:1002,;20,*weight,,route1,,1002,RP_10CNT,,,;20,,1003@192.168.56.203
-cgrates.org,ROUTE_ACNT_1002,,;10,,,route2,,1002,RP_20CNT,,,;10,,1004@192.168.57.203
-cgrates.org,ROUTE_ACNT_1002,,;5,,,route3,,1002,RP_1CNT,,,;5,,1005@192.168.58.203
+#Tenant,ID,FilterIDs,Weights,Sorting,SortingParameters,Blockers,RouteID,RouteFilterIDs,RouteAccountIDs,RouteRateProfileIDs,RouteResourceIDs,RouteStatIDs,RouteWeights,RouteBlocker,RouteParameters
+cgrates.org,ROUTE_ACNT_1001,*string:~*req.Account:1001,;20,*weight,,,route1,,1001,RP_10CNT,,,;20,,cgrates.org
+cgrates.org,ROUTE_ACNT_1001,,;10,,,,route2,,1001,RP_20CNT,,,;10,,cgrates.net
+cgrates.org,ROUTE_ACNT_1001,,;5,,,,route3,,1001,RP_1CNT,,,;5,,cgrates.com
+cgrates.org,ROUTE_ACNT_1002,*string:~*req.Account:1002,;20,*weight,,,route1,,1002,RP_10CNT,,,;20,,1003@192.168.56.203
+cgrates.org,ROUTE_ACNT_1002,,;10,,,,route2,,1002,RP_20CNT,,,;10,,1004@192.168.57.203
+cgrates.org,ROUTE_ACNT_1002,,;5,,,,route3,,1002,RP_1CNT,,,;5,,1005@192.168.58.203
diff --git a/data/tariffplans/tutorial/Routes.csv b/data/tariffplans/tutorial/Routes.csv
index 6f6bc071a..e67514c70 100644
--- a/data/tariffplans/tutorial/Routes.csv
+++ b/data/tariffplans/tutorial/Routes.csv
@@ -1,8 +1,8 @@
-#Tenant,ID,FilterIDs,Weights,Sorting,SortingParameters,RouteID,RouteFilterIDs,RouteAccountIDs,RouteRateProfileIDs,RouteResourceIDs,RouteStatIDs,RouteWeights,RouteBlocker,RouteParameters
-cgrates.org,ROUTE_ACNT_1001,FLTR_ACNT_1001,;10,*weight,,route1,,,,,,;10,,
-cgrates.org,ROUTE_ACNT_1001,,;20,,,route2,,,,,,;20,,
-cgrates.org,ROUTE_ACNT_1002,FLTR_ACNT_1002,;10,*lc,,route1,,,RP_1002_LOW,,,;10,false,
-cgrates.org,ROUTE_ACNT_1002,,,,,route2,,,RP_1002,,,;20,,
-cgrates.org,ROUTE_ACNT_1003,FLTR_ACNT_1003,;10,*qos,*tcc;*tcd,route1,,,,,Stats2,;10,false,
-cgrates.org,ROUTE_ACNT_1003,,,,,route2,,,,,Stats2_1,;20,,
+#Tenant,ID,FilterIDs,Weights,Sorting,SortingParameters,Blockers,RouteID,RouteFilterIDs,RouteAccountIDs,RouteRateProfileIDs,RouteResourceIDs,RouteStatIDs,RouteWeights,RouteBlocker,RouteParameters
+cgrates.org,ROUTE_ACNT_1001,FLTR_ACNT_1001,;10,*weight,,,route1,,,,,,;10,,
+cgrates.org,ROUTE_ACNT_1001,,;20,,,,route2,,,,,,;20,,
+cgrates.org,ROUTE_ACNT_1002,FLTR_ACNT_1002,;10,*lc,,,route1,,,RP_1002_LOW,,,;10,false,
+cgrates.org,ROUTE_ACNT_1002,,,,,,route2,,,RP_1002,,,;20,,
+cgrates.org,ROUTE_ACNT_1003,FLTR_ACNT_1003,;10,*qos,*tcc;*tcd,,route1,,,,,Stats2,;10,false,
+cgrates.org,ROUTE_ACNT_1003,,,,,,route2,,,,,Stats2_1,;20,,
diff --git a/data/tariffplans/tutroutes/Routes.csv b/data/tariffplans/tutroutes/Routes.csv
index af9b26cc6..cb1c24cd4 100644
--- a/data/tariffplans/tutroutes/Routes.csv
+++ b/data/tariffplans/tutroutes/Routes.csv
@@ -1,39 +1,39 @@
-#Tenant,ID,FilterIDs,Weights,Sorting,SortingParameters,RouteID,RouteFilterIDs,RouteAccountIDs,RouteRateProfileIDs,RouteResourceIDs,RouteStatIDs,RouteWeights,RouteBlocker,RouteParameters
+#Tenant,ID,FilterIDs,Weights,Sorting,SortingParameters,Blockers,RouteID,RouteFilterIDs,RouteAccountIDs,RouteRateProfileIDs,RouteResourceIDs,RouteStatIDs,RouteWeights,RouteBlocker,RouteParameters
-cgrates.org,ROUTE_ACNT_1001,*string:~*req.Account:1001,,*weight,,vendor1,FLTR_DEST_1003,,,,,;10,,,
-cgrates.org,ROUTE_ACNT_1001,,,,,vendor2,*gte:~*accounts.1001.Balances[Concrete1].Units:10,,,,,;20,,,
-cgrates.org,ROUTE_ACNT_1001,,,,,vendor3,FLTR_DEST_1003;*prefix:~*req.Account:10,,,,,;40,,,
-cgrates.org,ROUTE_ACNT_1001,,,,,vendor4,,,,,,;35,,,
+cgrates.org,ROUTE_ACNT_1001,*string:~*req.Account:1001,,*weight,,,vendor1,FLTR_DEST_1003,,,,,;10,,
+cgrates.org,ROUTE_ACNT_1001,,,,,,vendor2,*gte:~*accounts.1001.Balances[Concrete1].Units:10,,,,,;20,,
+cgrates.org,ROUTE_ACNT_1001,,,,,,vendor3,FLTR_DEST_1003;*prefix:~*req.Account:10,,,,,;40,,
+cgrates.org,ROUTE_ACNT_1001,,,,,,vendor4,,,,,,;35,,
-cgrates.org,ROUTE_ACNT_1002,*string:~*req.Account:1002,,*lc,,vendor1,*lte:~*resources.RES_GRP1.TotalUsage:5,,RP_VENDOR1,,,;0,,,
-cgrates.org,ROUTE_ACNT_1002,,,,,vendor2,*gte:~*stats.STATS_VENDOR_2.*acd:1m,,RP_VENDOR2,,,;0,,,
-cgrates.org,ROUTE_ACNT_1002,,,,,vendor3,,,RP_VENDOR2,,,;10,,,
-cgrates.org,ROUTE_ACNT_1002,,,,,vendor4,*ai:~*opts.*startTime:2013-06-01T00:00:00Z|2013-06-01T10:00:00Z,,RP_STANDARD,,,;30,,,
+cgrates.org,ROUTE_ACNT_1002,*string:~*req.Account:1002,,*lc,,,vendor1,*lte:~*resources.RES_GRP1.TotalUsage:5,,RP_VENDOR1,,,;0,,
+cgrates.org,ROUTE_ACNT_1002,,,,,,vendor2,*gte:~*stats.STATS_VENDOR_2.*acd:1m,,RP_VENDOR2,,,;0,,
+cgrates.org,ROUTE_ACNT_1002,,,,,,vendor3,,,RP_VENDOR2,,,;10,,
+cgrates.org,ROUTE_ACNT_1002,,,,,,vendor4,*ai:~*opts.*startTime:2013-06-01T00:00:00Z|2013-06-01T10:00:00Z,,RP_STANDARD,,,;30,,
-cgrates.org,ROUTE_ACNT_1003,*string:~*req.Account:1003,,*qos,*acd;*tcc,vendor1,,,,,STATS_VENDOR_1,;0,,,
-cgrates.org,ROUTE_ACNT_1003,,,,,vendor2,*prefix:~*req.Destination:10,,,,STATS_VENDOR_2,;0,,,
-cgrates.org,ROUTE_ACNT_1003,,,,,vendor3,*gte:~*stats.STATS_VENDOR_1.*tcc:6,,,,STATS_VENDOR_1,;20,,,
+cgrates.org,ROUTE_ACNT_1003,*string:~*req.Account:1003,,*qos,*acd;*tcc,,vendor1,,,,,STATS_VENDOR_1,;0,,
+cgrates.org,ROUTE_ACNT_1003,,,,,,vendor2,*prefix:~*req.Destination:10,,,,STATS_VENDOR_2,;0,,
+cgrates.org,ROUTE_ACNT_1003,,,,,,vendor3,*gte:~*stats.STATS_VENDOR_1.*tcc:6,,,,STATS_VENDOR_1,;20,,
-cgrates.org,ROUTE_ACNT_1004,*string:~*req.Account:1004,,*reas,,vendor1,,,,RES_GRP1,,;0,,,
-cgrates.org,ROUTE_ACNT_1004,,,,,vendor2,,,,RES_GRP2,,;0,,,
-cgrates.org,ROUTE_ACNT_1004,,,,,vendor3,*gte:~*resources.RES_GRP1.TotalUsage:9,,,RES_GRP2,,;10,,,
+cgrates.org,ROUTE_ACNT_1004,*string:~*req.Account:1004,,*reas,,,vendor1,,,,RES_GRP1,,;0,,
+cgrates.org,ROUTE_ACNT_1004,,,,,,vendor2,,,,RES_GRP2,,;0,,
+cgrates.org,ROUTE_ACNT_1004,,,,,,vendor3,*gte:~*resources.RES_GRP1.TotalUsage:9,,,RES_GRP2,,;10,,
-cgrates.org,ROUTE_ACNT_1005,*string:~*req.Account:1005,,*load,vendor1:3;*default:2,vendor1,,,,,STATS_VENDOR_1:*sum#1,,,,
-cgrates.org,ROUTE_ACNT_1005,,,,,vendor2,,,,,STATS_VENDOR_2:*sum#1,;10,,,
-cgrates.org,ROUTE_ACNT_1005,,,,,vendor3,,,,,STATS_VENDOR_2:*distinct#~*opts.*usage,,,,
+cgrates.org,ROUTE_ACNT_1005,*string:~*req.Account:1005,,*load,vendor1:3;*default:2,,vendor1,,,,,STATS_VENDOR_1:*sum#1,,,
+cgrates.org,ROUTE_ACNT_1005,,,,,,vendor2,,,,,STATS_VENDOR_2:*sum#1,;10,,
+cgrates.org,ROUTE_ACNT_1005,,,,,,vendor3,,,,,STATS_VENDOR_2:*distinct#~*opts.*usage,,,
-cgrates.org,ROUTE_HC1,Fltr_tcc,,*hc,,route1,*gte:~*resources.RES_GRP2.Available:6,,RP_VENDOR2,RES_GRP2,,;20,,,
-cgrates.org,ROUTE_HC1,,,,,route2,*gte:~*resources.RES_GRP1.TotalUsage:9,,RP_VENDOR1,RES_GRP1,,;20,,,
-cgrates.org,ROUTE_HC1,,,,,route3,,,RP_VENDOR1,RES_GRP2,,;10,,,
+cgrates.org,ROUTE_HC1,Fltr_tcc,,*hc,,,route1,*gte:~*resources.RES_GRP2.Available:6,,RP_VENDOR2,RES_GRP2,,;20,,
+cgrates.org,ROUTE_HC1,,,,,,route2,*gte:~*resources.RES_GRP1.TotalUsage:9,,RP_VENDOR1,RES_GRP1,,;20,,
+cgrates.org,ROUTE_HC1,,,,,,route3,,,RP_VENDOR1,RES_GRP2,,;10,,
cgrates.org,ROUTE_QOS_STATS,*prefix:~*req.Destination:+3342,,*qos,*asr;*acd,,,,,,,,,,
-cgrates.org,ROUTE_QOS_STATS,,,,,route1,,,,,STATS_TOP1,;20,,,
-cgrates.org,ROUTE_QOS_STATS,,,,,route2,,,,,STATS_TOP2,;50,,,
+cgrates.org,ROUTE_QOS_STATS,,,,,,route1,,,,,STATS_TOP1,;20,,
+cgrates.org,ROUTE_QOS_STATS,,,,,,route2,,,,,STATS_TOP2,;50,,
cgrates.org,ROUTE_LCR,*prefix:~*req.Destination:+2273,,*lc,,,,,,,,,,,
-cgrates.org,ROUTE_LCR,,,,,route1,*gte:~*stats.STATS_TOP3.*acd:1m;*lte:~*stats.STATS_TOP2.*asr:50,,RP_VENDOR1,,,;20,,,
-cgrates.org,ROUTE_LCR,,,,,route2,*eq:~*stats.STATS_TOP3.*asr:100,,RP_STANDARD,,,;15,,,
-cgrates.org,ROUTE_LCR,,,,,route3,*gt:~*stats.STATS_TOP1.*acd:30s,,RP_VENDOR2,,,;10,,,
+cgrates.org,ROUTE_LCR,,,,,,route1,*gte:~*stats.STATS_TOP3.*acd:1m;*lte:~*stats.STATS_TOP2.*asr:50,,RP_VENDOR1,,,;20,,
+cgrates.org,ROUTE_LCR,,,,,,route2,*eq:~*stats.STATS_TOP3.*asr:100,,RP_STANDARD,,,;15,,
+cgrates.org,ROUTE_LCR,,,,,,route3,*gt:~*stats.STATS_TOP1.*acd:30s,,RP_VENDOR2,,,;10,,
diff --git a/engine/libtest.go b/engine/libtest.go
index a4e8120ad..65c311390 100644
--- a/engine/libtest.go
+++ b/engine/libtest.go
@@ -113,11 +113,11 @@ cgrates.org,FLTR_DST_DE,*destinations,~*req.Destination,DST_DE
cgrates.org,FLTR_DST_NL,*destinations,~*req.Destination,DST_NL
`
RoutesCSVContent = `
-#Tenant[0],ID[1],FilterIDs[2],Weights[3],Sorting[4],SortingParameters[5],RouteID[6],RouteFilterIDs[7],RouteAccountIDs[8],RouteRateProfileIDs[9],RouteResourceIDs[10],RouteStatIDs[11],RouteWeights[12],RouteBlocker[13],RouteParameters[14]
-cgrates.org,RoutePrf1,*string:~*req.Account:dan,;20,*lc,,route1,FLTR_ACNT_dan,Account1;Account1_1,RPL_1,ResGroup1,Stat1,;10,true,param1
-cgrates.org,RoutePrf1,,,,,route1,,,RPL_2,ResGroup2,,;10,,
-cgrates.org,RoutePrf1,,,,,route1,FLTR_DST_DE,Account2,RPL_3,ResGroup3,Stat2,;10,,
-cgrates.org,RoutePrf1,,,,,route1,,,,ResGroup4,Stat3,;10,,
+#Tenant[0],ID[1],FilterIDs[2],Weights[3],Sorting[4],SortingParameters[5],Blockers[6],RouteID[7],RouteFilterIDs[8],RouteAccountIDs[9],RouteRateProfileIDs[10],RouteResourceIDs[11],RouteStatIDs[12],RouteWeights[13],RouteBlocker[14],RouteParameters[15]
+cgrates.org,RoutePrf1,*string:~*req.Account:dan,;20,*lc,,,route1,FLTR_ACNT_dan,Account1;Account1_1,RPL_1,ResGroup1,Stat1,;10,true,param1
+cgrates.org,RoutePrf1,,,,,,route1,,,RPL_2,ResGroup2,,;10,,
+cgrates.org,RoutePrf1,,,,,,route1,FLTR_DST_DE,Account2,RPL_3,ResGroup3,Stat2,;10,,
+cgrates.org,RoutePrf1,,,,,,route1,,,,ResGroup4,Stat3,;10,,
`
AttributesCSVContent = `
#Tenant,ID,FilterIDs,Weights,Blockers,AttributeFilterIDs,Path,Type,Value,AttributeBlockers
diff --git a/engine/model_helpers.go b/engine/model_helpers.go
index e9119f0b4..880568345 100644
--- a/engine/model_helpers.go
+++ b/engine/model_helpers.go
@@ -829,14 +829,14 @@ func (tps RouteMdls) CSVHeader() (result []string) {
func (tps RouteMdls) AsTPRouteProfile() (result []*utils.TPRouteProfile) {
filterMap := make(map[string]utils.StringSet)
- mst := make(map[string]*utils.TPRouteProfile)
+ tpRouteProfileMap := make(map[string]*utils.TPRouteProfile)
routeMap := make(map[string]map[string]*utils.TPRoute)
sortingParameterMap := make(map[string]utils.StringSet)
for _, tp := range tps {
tenID := (&utils.TenantID{Tenant: tp.Tenant, ID: tp.ID}).TenantID()
- th, found := mst[tenID]
+ tpRouteProfile, found := tpRouteProfileMap[tenID]
if !found {
- th = &utils.TPRouteProfile{
+ tpRouteProfile = &utils.TPRouteProfile{
TPid: tp.Tpid,
Tenant: tp.Tenant,
ID: tp.ID,
@@ -852,9 +852,9 @@ func (tps RouteMdls) AsTPRouteProfile() (result []*utils.TPRouteProfile) {
routeID = utils.ConcatenatedKey(routeID,
utils.NewStringSet(strings.Split(tp.RouteFilterIDs, utils.InfieldSep)).Sha1())
}
- sup, found := routeMap[tenID][routeID]
+ tpRoute, found := routeMap[tenID][routeID]
if !found {
- sup = &utils.TPRoute{
+ tpRoute = &utils.TPRoute{
ID: tp.RouteID,
Weights: tp.RouteWeights,
Blocker: tp.RouteBlocker,
@@ -862,29 +862,29 @@ func (tps RouteMdls) AsTPRouteProfile() (result []*utils.TPRouteProfile) {
}
}
if tp.RouteFilterIDs != utils.EmptyString {
- supFilterSplit := strings.Split(tp.RouteFilterIDs, utils.InfieldSep)
- sup.FilterIDs = append(sup.FilterIDs, supFilterSplit...)
+ routeFilterSplit := strings.Split(tp.RouteFilterIDs, utils.InfieldSep)
+ tpRoute.FilterIDs = append(tpRoute.FilterIDs, routeFilterSplit...)
}
if tp.RouteRateProfileIDs != utils.EmptyString {
ratingPlanSplit := strings.Split(tp.RouteRateProfileIDs, utils.InfieldSep)
- sup.RateProfileIDs = append(sup.RateProfileIDs, ratingPlanSplit...)
+ tpRoute.RateProfileIDs = append(tpRoute.RateProfileIDs, ratingPlanSplit...)
}
if tp.RouteResourceIDs != utils.EmptyString {
resSplit := strings.Split(tp.RouteResourceIDs, utils.InfieldSep)
- sup.ResourceIDs = append(sup.ResourceIDs, resSplit...)
+ tpRoute.ResourceIDs = append(tpRoute.ResourceIDs, resSplit...)
}
if tp.RouteStatIDs != utils.EmptyString {
statSplit := strings.Split(tp.RouteStatIDs, utils.InfieldSep)
- sup.StatIDs = append(sup.StatIDs, statSplit...)
+ tpRoute.StatIDs = append(tpRoute.StatIDs, statSplit...)
}
if tp.RouteAccountIDs != utils.EmptyString {
accSplit := strings.Split(tp.RouteAccountIDs, utils.InfieldSep)
- sup.AccountIDs = append(sup.AccountIDs, accSplit...)
+ tpRoute.AccountIDs = append(tpRoute.AccountIDs, accSplit...)
}
- routeMap[tenID][routeID] = sup
+ routeMap[tenID][routeID] = tpRoute
}
if tp.Sorting != utils.EmptyString {
- th.Sorting = tp.Sorting
+ tpRouteProfile.Sorting = tp.Sorting
}
if tp.SortingParameters != utils.EmptyString {
if _, has := sortingParameterMap[tenID]; !has {
@@ -893,7 +893,10 @@ func (tps RouteMdls) AsTPRouteProfile() (result []*utils.TPRouteProfile) {
sortingParameterMap[tenID].AddSlice(strings.Split(tp.SortingParameters, utils.InfieldSep))
}
if tp.Weights != utils.EmptyString {
- th.Weights = tp.Weights
+ tpRouteProfile.Weights = tp.Weights
+ }
+ if tp.Blockers != utils.EmptyString {
+ tpRouteProfile.Blockers = tp.Blockers
}
if tp.FilterIDs != utils.EmptyString {
if _, has := filterMap[tenID]; !has {
@@ -901,14 +904,14 @@ func (tps RouteMdls) AsTPRouteProfile() (result []*utils.TPRouteProfile) {
}
filterMap[tenID].AddSlice(strings.Split(tp.FilterIDs, utils.InfieldSep))
}
- mst[tenID] = th
+ tpRouteProfileMap[tenID] = tpRouteProfile
}
- result = make([]*utils.TPRouteProfile, len(mst))
+ result = make([]*utils.TPRouteProfile, len(tpRouteProfileMap))
i := 0
- for tntID, th := range mst {
- result[i] = th
- for _, supData := range routeMap[tntID] {
- result[i].Routes = append(result[i].Routes, supData)
+ for tntID, tpRouteProfile := range tpRouteProfileMap {
+ result[i] = tpRouteProfile
+ for _, routeData := range routeMap[tntID] {
+ result[i].Routes = append(result[i].Routes, routeData)
}
result[i].FilterIDs = filterMap[tntID].AsSlice()
result[i].SortingParameters = sortingParameterMap[tntID].AsSlice()
@@ -921,7 +924,7 @@ func APItoModelTPRoutes(st *utils.TPRouteProfile) (mdls RouteMdls) {
if len(st.Routes) == 0 {
return
}
- for i, supl := range st.Routes {
+ for i, route := range st.Routes {
mdl := &RouteMdl{
Tenant: st.Tenant,
Tpid: st.TPid,
@@ -930,6 +933,7 @@ func APItoModelTPRoutes(st *utils.TPRouteProfile) (mdls RouteMdls) {
if i == 0 {
mdl.Sorting = st.Sorting
mdl.Weights = st.Weights
+ mdl.Blockers = st.Blockers
for i, val := range st.FilterIDs {
if i != 0 {
mdl.FilterIDs += utils.InfieldSep
@@ -943,40 +947,40 @@ func APItoModelTPRoutes(st *utils.TPRouteProfile) (mdls RouteMdls) {
mdl.SortingParameters += val
}
}
- mdl.RouteID = supl.ID
- for i, val := range supl.AccountIDs {
+ mdl.RouteID = route.ID
+ for i, val := range route.AccountIDs {
if i != 0 {
mdl.RouteAccountIDs += utils.InfieldSep
}
mdl.RouteAccountIDs += val
}
- for i, val := range supl.RateProfileIDs {
+ for i, val := range route.RateProfileIDs {
if i != 0 {
mdl.RouteRateProfileIDs += utils.InfieldSep
}
mdl.RouteRateProfileIDs += val
}
- for i, val := range supl.FilterIDs {
+ for i, val := range route.FilterIDs {
if i != 0 {
mdl.RouteFilterIDs += utils.InfieldSep
}
mdl.RouteFilterIDs += val
}
- for i, val := range supl.ResourceIDs {
+ for i, val := range route.ResourceIDs {
if i != 0 {
mdl.RouteResourceIDs += utils.InfieldSep
}
mdl.RouteResourceIDs += val
}
- for i, val := range supl.StatIDs {
+ for i, val := range route.StatIDs {
if i != 0 {
mdl.RouteStatIDs += utils.InfieldSep
}
mdl.RouteStatIDs += val
}
- mdl.RouteWeights = supl.Weights
- mdl.RouteParameters = supl.RouteParameters
- mdl.RouteBlocker = supl.Blocker
+ mdl.RouteWeights = route.Weights
+ mdl.RouteParameters = route.RouteParameters
+ mdl.RouteBlocker = route.Blocker
mdls = append(mdls, mdl)
}
return
@@ -992,11 +996,18 @@ func APItoRouteProfile(tpRp *utils.TPRouteProfile, timezone string) (rp *RoutePr
FilterIDs: make([]string, len(tpRp.FilterIDs)),
}
if tpRp.Weights != utils.EmptyString {
- weight, err := utils.NewDynamicWeightsFromString(tpRp.Weights, utils.InfieldSep, utils.ANDSep)
+ weights, err := utils.NewDynamicWeightsFromString(tpRp.Weights, utils.InfieldSep, utils.ANDSep)
if err != nil {
return nil, err
}
- rp.Weights = weight
+ rp.Weights = weights
+ }
+ if tpRp.Blockers != utils.EmptyString {
+ blockers, err := utils.NewBlockersFromString(tpRp.Blockers, utils.InfieldSep, utils.ANDSep)
+ if err != nil {
+ return nil, err
+ }
+ rp.Blockers = blockers
}
for i, stp := range tpRp.SortingParameters {
rp.SortingParameters[i] = stp
@@ -1035,6 +1046,7 @@ func RouteProfileToAPI(rp *RouteProfile) (tpRp *utils.TPRouteProfile) {
SortingParameters: make([]string, len(rp.SortingParameters)),
Routes: make([]*utils.TPRoute, len(rp.Routes)),
Weights: rp.Weights.String(utils.InfieldSep, utils.ANDSep),
+ Blockers: rp.Blockers.String(utils.InfieldSep, utils.ANDSep),
}
for i, route := range rp.Routes {
diff --git a/engine/models.go b/engine/models.go
index cdabfb22f..256e22180 100644
--- a/engine/models.go
+++ b/engine/models.go
@@ -199,15 +199,16 @@ type RouteMdl struct {
Weights string `index:"3" re:""`
Sorting string `index:"4" re:""`
SortingParameters string `index:"5" re:""`
- RouteID string `index:"6" re:""`
- RouteFilterIDs string `index:"7" re:""`
- RouteAccountIDs string `index:"8" re:""`
- RouteRateProfileIDs string `index:"9" re:""`
- RouteResourceIDs string `index:"10" re:""`
- RouteStatIDs string `index:"11" re:""`
- RouteWeights string `index:"12" re:""`
- RouteBlocker bool `index:"13" re:""`
- RouteParameters string `index:"14" re:""`
+ Blockers string `index:"6" re:""`
+ RouteID string `index:"7" re:""`
+ RouteFilterIDs string `index:"8" re:""`
+ RouteAccountIDs string `index:"9" re:""`
+ RouteRateProfileIDs string `index:"10" re:""`
+ RouteResourceIDs string `index:"11" re:""`
+ RouteStatIDs string `index:"12" re:""`
+ RouteWeights string `index:"13" re:""`
+ RouteBlocker bool `index:"14" re:""`
+ RouteParameters string `index:"15" re:""`
CreatedAt time.Time
}
diff --git a/engine/routes.go b/engine/routes.go
index ca84b3bba..fdade8da5 100644
--- a/engine/routes.go
+++ b/engine/routes.go
@@ -50,6 +50,7 @@ type RouteProfile struct {
FilterIDs []string
Sorting string // Sorting strategy
SortingParameters []string
+ Blockers utils.Blockers
Routes []*Route
Weights utils.DynamicWeights
}
@@ -182,6 +183,16 @@ func (rpS *RouteS) matchingRouteProfilesForEvent(ctx *context.Context, tnt strin
return nil, utils.ErrNotFound
}
matchingRPrf.Sort()
+ for i, rp := range matchingRPrf {
+ var blocker bool
+ if blocker, err = BlockerFromDynamics(ctx, rp.Blockers, rpS.fltrS, ev.Tenant, evNm); err != nil {
+ return
+ }
+ if blocker {
+ matchingRPrf = matchingRPrf[0 : i+1]
+ break
+ }
+ }
return
}
@@ -496,6 +507,10 @@ func (rp *RouteProfile) Set(path []string, val interface{}, newBranch bool, _ st
if val != utils.EmptyString {
rp.Weights, err = utils.NewDynamicWeightsFromString(utils.IfaceAsString(val), utils.InfieldSep, utils.ANDSep)
}
+ case utils.BlockersField:
+ if val != utils.EmptyString {
+ rp.Blockers, err = utils.NewBlockersFromString(utils.IfaceAsString(val), utils.InfieldSep, utils.ANDSep)
+ }
}
case 2:
if val == utils.EmptyString {
@@ -569,6 +584,7 @@ func (rp *RouteProfile) Merge(v2 interface{}) {
equal = false
}
rp.Weights = append(rp.Weights, vi.Weights...)
+ rp.Blockers = append(rp.Blockers, vi.Blockers...)
if len(vi.Sorting) != 0 {
rp.Sorting = vi.Sorting
}
@@ -634,6 +650,8 @@ func (rp *RouteProfile) FieldAsInterface(fldPath []string) (_ interface{}, err e
return rp.SortingParameters, nil
case utils.Sorting:
return rp.Sorting, nil
+ case utils.BlockersField:
+ return rp.Blockers.String(utils.InfieldSep, utils.ANDSep), nil
case utils.Routes:
return rp.Routes, nil
}
diff --git a/utils/apitpdata.go b/utils/apitpdata.go
index 1225d4aff..552268df0 100644
--- a/utils/apitpdata.go
+++ b/utils/apitpdata.go
@@ -302,6 +302,7 @@ type TPRouteProfile struct {
SortingParameters []string
Routes []*TPRoute
Weights string
+ Blockers string
}
// TPAttribute is used in TPAttributeProfile