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