From 1901be04852b60aa4bf025006f56ee4242c06c53 Mon Sep 17 00:00:00 2001 From: ionutboangiu Date: Thu, 11 Nov 2021 18:22:42 +0200 Subject: [PATCH] Add opts for the routes subsystem --- apier/v1/api_interfaces.go | 4 +- apier/v1/dispatcher.go | 4 +- apier/v1/routes.go | 4 +- apier/v1/routes_it_test.go | 404 ++++++++++++------------- apier/v1/sessionsv1_it_test.go | 2 +- config/config.go | 2 +- config/config_defaults.go | 10 +- config/config_json_test.go | 6 + config/config_test.go | 22 +- config/libconfig_json.go | 10 + config/routescfg.go | 69 +++++ config/routescfg_test.go | 19 ++ console/routes.go | 13 +- dispatchers/routes.go | 20 +- dispatchers/routes_it_test.go | 114 ++++--- dispatchers/routes_test.go | 24 +- dispatchers/sessions_it_test.go | 4 +- engine/routes.go | 140 +++++---- engine/routes_test.go | 160 ++++------ general_tests/route_it_test.go | 56 ++-- general_tests/routes_cases_it_test.go | 320 +++++++++----------- general_tests/sessionroutes_it_test.go | 6 +- sessions/sessions.go | 10 +- sessions/sessionscover_test.go | 2 +- utils/cgrevent_test.go | 18 +- utils/consts.go | 27 +- 26 files changed, 736 insertions(+), 734 deletions(-) diff --git a/apier/v1/api_interfaces.go b/apier/v1/api_interfaces.go index a1a34c22e..9fee694af 100644 --- a/apier/v1/api_interfaces.go +++ b/apier/v1/api_interfaces.go @@ -57,9 +57,9 @@ type ResourceSv1Interface interface { } type RouteSv1Interface interface { - GetRoutes(args *engine.ArgsGetRoutes, reply *engine.SortedRoutesList) error + GetRoutes(args *utils.CGREvent, reply *engine.SortedRoutesList) error GetRouteProfilesForEvent(args *utils.CGREvent, reply *[]*engine.RouteProfile) error - GetRoutesList(args *engine.ArgsGetRoutes, reply *[]string) error + GetRoutesList(args *utils.CGREvent, reply *[]string) error Ping(ign *utils.CGREvent, reply *string) error } diff --git a/apier/v1/dispatcher.go b/apier/v1/dispatcher.go index 04e155f7f..ae4e629bb 100644 --- a/apier/v1/dispatcher.go +++ b/apier/v1/dispatcher.go @@ -346,7 +346,7 @@ func (dRoute *DispatcherRouteSv1) Ping(args *utils.CGREvent, reply *string) erro } // GetRoutes implements RouteSv1GetRoutes -func (dRoute *DispatcherRouteSv1) GetRoutes(args *engine.ArgsGetRoutes, reply *engine.SortedRoutesList) error { +func (dRoute *DispatcherRouteSv1) GetRoutes(args *utils.CGREvent, reply *engine.SortedRoutesList) error { return dRoute.dRoute.RouteSv1GetRoutes(args, reply) } @@ -356,7 +356,7 @@ func (dRoute *DispatcherRouteSv1) GetRouteProfilesForEvent(args *utils.CGREvent, } // GetRoutesList returns sorted list of routes for Event as a string slice -func (dRoute *DispatcherRouteSv1) GetRoutesList(args *engine.ArgsGetRoutes, reply *[]string) error { +func (dRoute *DispatcherRouteSv1) GetRoutesList(args *utils.CGREvent, reply *[]string) error { return dRoute.dRoute.RouteSv1GetRoutesList(args, reply) } diff --git a/apier/v1/routes.go b/apier/v1/routes.go index 8afee86f2..825b01e0b 100644 --- a/apier/v1/routes.go +++ b/apier/v1/routes.go @@ -133,7 +133,7 @@ func (rS *RouteSv1) Call(serviceMethod string, args interface{}, reply interface } // GetRoutes returns sorted list of routes for Event -func (rS *RouteSv1) GetRoutes(args *engine.ArgsGetRoutes, reply *engine.SortedRoutesList) error { +func (rS *RouteSv1) GetRoutes(args *utils.CGREvent, reply *engine.SortedRoutesList) error { return rS.rS.V1GetRoutes(args, reply) } @@ -148,6 +148,6 @@ func (rS *RouteSv1) Ping(ign *utils.CGREvent, reply *string) error { } // GetRoutesList returns sorted list of routes for Event as a string slice -func (rS *RouteSv1) GetRoutesList(args *engine.ArgsGetRoutes, reply *[]string) error { +func (rS *RouteSv1) GetRoutesList(args *utils.CGREvent, reply *[]string) error { return rS.rS.V1GetRoutesList(args, reply) } diff --git a/apier/v1/routes_it_test.go b/apier/v1/routes_it_test.go index 6ec2bbb75..368d531d8 100644 --- a/apier/v1/routes_it_test.go +++ b/apier/v1/routes_it_test.go @@ -178,16 +178,14 @@ func testV1RouteFromFolder(t *testing.T) { } func testV1RouteGetWeightRoutes(t *testing.T) { - ev := &engine.ArgsGetRoutes{ - CGREvent: &utils.CGREvent{ - Tenant: "cgrates.org", - ID: "testV1RouteGetWeightRoutes", - Event: map[string]interface{}{ - utils.AccountField: "1007", - utils.Destination: "+491511231234", - }, - APIOpts: map[string]interface{}{utils.OptsRoutesProfilesCount: 1}, + ev := &utils.CGREvent{ + Tenant: "cgrates.org", + ID: "testV1RouteGetWeightRoutes", + Event: map[string]interface{}{ + utils.AccountField: "1007", + utils.Destination: "+491511231234", }, + APIOpts: map[string]interface{}{utils.OptsRoutesProfileCount: 1}, } eSpls := engine.SortedRoutesList{{ ProfileID: "ROUTE_WEIGHT_1", @@ -216,7 +214,7 @@ func testV1RouteGetWeightRoutes(t *testing.T) { utils.ToJSON(eSpls), utils.ToJSON(suplsReply)) } - ev.CGREvent.Tenant = utils.EmptyString + ev.Tenant = utils.EmptyString if err := routeSv1Rpc.Call(utils.RouteSv1GetRoutes, ev, &suplsReply); err != nil { t.Error(err) @@ -227,19 +225,17 @@ func testV1RouteGetWeightRoutes(t *testing.T) { } func testV1RouteGetLeastCostRoutes(t *testing.T) { - ev := &engine.ArgsGetRoutes{ - CGREvent: &utils.CGREvent{ - Tenant: "cgrates.org", - ID: "testV1RouteGetLeastCostRoutes", - Event: map[string]interface{}{ - utils.AccountField: "1003", - utils.Subject: "1003", - utils.Destination: "1002", - utils.SetupTime: time.Date(2017, 12, 1, 14, 25, 0, 0, time.UTC), - utils.Usage: "1m20s", - }, - APIOpts: map[string]interface{}{utils.OptsRoutesProfilesCount: 1}, + ev := &utils.CGREvent{ + Tenant: "cgrates.org", + ID: "testV1RouteGetLeastCostRoutes", + Event: map[string]interface{}{ + utils.AccountField: "1003", + utils.Subject: "1003", + utils.Destination: "1002", + utils.SetupTime: time.Date(2017, 12, 1, 14, 25, 0, 0, time.UTC), + utils.Usage: "1m20s", }, + APIOpts: map[string]interface{}{utils.OptsRoutesProfileCount: 1}, } eSpls := engine.SortedRoutesList{{ ProfileID: "ROUTE_LEASTCOST_1", @@ -282,18 +278,16 @@ func testV1RouteGetLeastCostRoutes(t *testing.T) { } func testV1RouteGetLeastCostRoutesWithoutUsage(t *testing.T) { - ev := &engine.ArgsGetRoutes{ - CGREvent: &utils.CGREvent{ - Tenant: "cgrates.org", - ID: "testV1RouteGetLeastCostRoutes", - Event: map[string]interface{}{ - utils.AccountField: "1003", - utils.Subject: "1003", - utils.Destination: "1002", - utils.SetupTime: time.Date(2017, 12, 1, 14, 25, 0, 0, time.UTC), - }, - APIOpts: map[string]interface{}{utils.OptsRoutesProfilesCount: 1}, + ev := &utils.CGREvent{ + Tenant: "cgrates.org", + ID: "testV1RouteGetLeastCostRoutes", + Event: map[string]interface{}{ + utils.AccountField: "1003", + utils.Subject: "1003", + utils.Destination: "1002", + utils.SetupTime: time.Date(2017, 12, 1, 14, 25, 0, 0, time.UTC), }, + APIOpts: map[string]interface{}{utils.OptsRoutesProfileCount: 1}, } eSpls := engine.SortedRoutesList{{ ProfileID: "ROUTE_LEASTCOST_1", @@ -336,19 +330,19 @@ func testV1RouteGetLeastCostRoutesWithoutUsage(t *testing.T) { } func testV1RouteGetLeastCostRoutesWithMaxCost(t *testing.T) { - ev := &engine.ArgsGetRoutes{ - MaxCost: "0.30", - CGREvent: &utils.CGREvent{ - Tenant: "cgrates.org", - ID: "testV1RouteGetLeastCostRoutes", - Event: map[string]interface{}{ - utils.AccountField: "1003", - utils.Subject: "1001", - utils.Destination: "1002", - utils.SetupTime: time.Date(2017, 12, 1, 14, 25, 0, 0, time.UTC), - utils.Usage: "1m20s", - }, - APIOpts: map[string]interface{}{utils.OptsRoutesProfilesCount: 1}, + ev := &utils.CGREvent{ + Tenant: "cgrates.org", + ID: "testV1RouteGetLeastCostRoutes", + Event: map[string]interface{}{ + utils.AccountField: "1003", + utils.Subject: "1001", + utils.Destination: "1002", + utils.SetupTime: time.Date(2017, 12, 1, 14, 25, 0, 0, time.UTC), + utils.Usage: "1m20s", + }, + APIOpts: map[string]interface{}{ + utils.OptsRoutesProfileCount: 1, + utils.OptsRoutesMaxCost: 0.30, }, } eSpls := engine.SortedRoutesList{{ @@ -384,18 +378,18 @@ func testV1RouteGetLeastCostRoutesWithMaxCost(t *testing.T) { } func testV1RouteGetLeastCostRoutesWithMaxCostNotFound(t *testing.T) { - ev := &engine.ArgsGetRoutes{ - MaxCost: "0.001", - CGREvent: &utils.CGREvent{ - Tenant: "cgrates.org", - ID: "testV1RouteGetLeastCostRoutes", - Event: map[string]interface{}{ - utils.AccountField: "1003", - utils.Subject: "1001", - utils.Destination: "1002", - utils.SetupTime: time.Date(2017, 12, 1, 14, 25, 0, 0, time.UTC), - utils.Usage: "1m20s", - }, + ev := &utils.CGREvent{ + Tenant: "cgrates.org", + ID: "testV1RouteGetLeastCostRoutes", + Event: map[string]interface{}{ + utils.AccountField: "1003", + utils.Subject: "1001", + utils.Destination: "1002", + utils.SetupTime: time.Date(2017, 12, 1, 14, 25, 0, 0, time.UTC), + utils.Usage: "1m20s", + }, + APIOpts: map[string]interface{}{ + utils.OptsRoutesMaxCost: 0.001, }, } var suplsReply engine.SortedRoutesList @@ -406,20 +400,20 @@ func testV1RouteGetLeastCostRoutesWithMaxCostNotFound(t *testing.T) { } func testV1RouteGetLeastCostRoutesWithMaxCost2(t *testing.T) { - ev := &engine.ArgsGetRoutes{ - MaxCost: utils.MetaEventCost, //0.1054 - CGREvent: &utils.CGREvent{ - Tenant: "cgrates.org", - ID: "testV1RouteGetLeastCostRoutes", - Event: map[string]interface{}{ - utils.AccountField: "1003", - utils.Subject: "SPECIAL_1002", - utils.Destination: "1002", - utils.SetupTime: time.Date(2014, 01, 14, 0, 0, 0, 0, time.UTC), - utils.Usage: "10m20s", - utils.Category: "call", - }, - APIOpts: map[string]interface{}{utils.OptsRoutesProfilesCount: 1}, + ev := &utils.CGREvent{ + Tenant: "cgrates.org", + ID: "testV1RouteGetLeastCostRoutes", + Event: map[string]interface{}{ + utils.AccountField: "1003", + utils.Subject: "SPECIAL_1002", + utils.Destination: "1002", + utils.SetupTime: time.Date(2014, 01, 14, 0, 0, 0, 0, time.UTC), + utils.Usage: "10m20s", + utils.Category: "call", + }, + APIOpts: map[string]interface{}{ + utils.OptsRoutesProfileCount: 1, + utils.OptsRoutesMaxCost: utils.MetaEventCost, }, } eSpls := engine.SortedRoutesList{{ @@ -455,19 +449,17 @@ func testV1RouteGetLeastCostRoutesWithMaxCost2(t *testing.T) { } func testV1RouteGetHighestCostRoutes(t *testing.T) { - ev := &engine.ArgsGetRoutes{ - CGREvent: &utils.CGREvent{ - Tenant: "cgrates.org", - ID: "testV1RouteGetHighestCostRoutes", - Event: map[string]interface{}{ - utils.AccountField: "1003", - utils.Destination: "1002", - utils.SetupTime: time.Date(2017, 12, 1, 14, 25, 0, 0, time.UTC), - utils.Usage: "1m20s", - "DistinctMatch": "*highest_cost", - }, - APIOpts: map[string]interface{}{utils.OptsRoutesProfilesCount: 1}, + ev := &utils.CGREvent{ + Tenant: "cgrates.org", + ID: "testV1RouteGetHighestCostRoutes", + Event: map[string]interface{}{ + utils.AccountField: "1003", + utils.Destination: "1002", + utils.SetupTime: time.Date(2017, 12, 1, 14, 25, 0, 0, time.UTC), + utils.Usage: "1m20s", + "DistinctMatch": "*highest_cost", }, + APIOpts: map[string]interface{}{utils.OptsRoutesProfileCount: 1}, } eSpls := engine.SortedRoutesList{{ ProfileID: "ROUTE_HIGHESTCOST_1", @@ -510,17 +502,17 @@ func testV1RouteGetHighestCostRoutes(t *testing.T) { } func testV1RouteGetLeastCostRoutesErr(t *testing.T) { - ev := &engine.ArgsGetRoutes{ // it gives error to leastCost but try next because of ignoreErrors flag - IgnoreErrors: true, - CGREvent: &utils.CGREvent{ - Tenant: "cgrates.org", - ID: "testV1RouteGetHighestCostRoutes", - Event: map[string]interface{}{ - utils.AccountField: "1000", - utils.Destination: "1001", - utils.SetupTime: "*now", - "Subject": "TEST", - }, + ev := &utils.CGREvent{ + Tenant: "cgrates.org", + ID: "testV1RouteGetHighestCostRoutes", + Event: map[string]interface{}{ + utils.AccountField: "1000", + utils.Destination: "1001", + utils.SetupTime: "*now", + "Subject": "TEST", + }, + APIOpts: map[string]interface{}{ + utils.OptsRoutesIgnoreErrors: true, }, } eSpls := engine.SortedRoutesList{{ @@ -670,13 +662,11 @@ func testV1RoutePolulateStatsForQOS(t *testing.T) { } func testV1RouteGetQOSRoutes(t *testing.T) { - ev := &engine.ArgsGetRoutes{ - CGREvent: &utils.CGREvent{ - Tenant: "cgrates.org", - ID: "testV1RouteGetQOSRoutes", - Event: map[string]interface{}{ - "DistinctMatch": "*qos", - }, + ev := &utils.CGREvent{ + Tenant: "cgrates.org", + ID: "testV1RouteGetQOSRoutes", + Event: map[string]interface{}{ + "DistinctMatch": "*qos", }, } expRouteIDs := []string{"route1", "route3", "route2"} @@ -701,13 +691,11 @@ func testV1RouteGetQOSRoutes(t *testing.T) { } func testV1RouteGetQOSRoutes2(t *testing.T) { - ev := &engine.ArgsGetRoutes{ - CGREvent: &utils.CGREvent{ - Tenant: "cgrates.org", - ID: "testV1RouteGetQOSRoutes", - Event: map[string]interface{}{ - "DistinctMatch": "*qos2", - }, + ev := &utils.CGREvent{ + Tenant: "cgrates.org", + ID: "testV1RouteGetQOSRoutes", + Event: map[string]interface{}{ + "DistinctMatch": "*qos2", }, } expRouteIDs := []string{"route3", "route2", "route1"} @@ -732,13 +720,11 @@ func testV1RouteGetQOSRoutes2(t *testing.T) { } func testV1RouteGetQOSRoutes3(t *testing.T) { - ev := &engine.ArgsGetRoutes{ - CGREvent: &utils.CGREvent{ - Tenant: "cgrates.org", - ID: "testV1RouteGetQOSRoutes", - Event: map[string]interface{}{ - "DistinctMatch": "*qos3", - }, + ev := &utils.CGREvent{ + Tenant: "cgrates.org", + ID: "testV1RouteGetQOSRoutes", + Event: map[string]interface{}{ + "DistinctMatch": "*qos3", }, } expRouteIDs := []string{"route1", "route3", "route2"} @@ -763,13 +749,11 @@ func testV1RouteGetQOSRoutes3(t *testing.T) { } func testV1RouteGetQOSRoutesFiltred(t *testing.T) { - ev := &engine.ArgsGetRoutes{ - CGREvent: &utils.CGREvent{ - Tenant: "cgrates.org", - ID: "testV1RouteGetQOSRoutes", - Event: map[string]interface{}{ - "DistinctMatch": "*qos_filtred", - }, + ev := &utils.CGREvent{ + Tenant: "cgrates.org", + ID: "testV1RouteGetQOSRoutes", + Event: map[string]interface{}{ + "DistinctMatch": "*qos_filtred", }, } expRouteIDs := []string{"route1", "route3"} @@ -794,17 +778,15 @@ func testV1RouteGetQOSRoutesFiltred(t *testing.T) { } func testV1RouteGetQOSRoutesFiltred2(t *testing.T) { - ev := &engine.ArgsGetRoutes{ - CGREvent: &utils.CGREvent{ - Tenant: "cgrates.org", - ID: "testV1RouteGetQOSRoutes", - Event: map[string]interface{}{ - "DistinctMatch": "*qos_filtred2", - utils.AccountField: "1003", - utils.Destination: "1002", - utils.SetupTime: time.Date(2017, 12, 1, 14, 25, 0, 0, time.UTC), - utils.Usage: "1m20s", - }, + ev := &utils.CGREvent{ + Tenant: "cgrates.org", + ID: "testV1RouteGetQOSRoutes", + Event: map[string]interface{}{ + "DistinctMatch": "*qos_filtred2", + utils.AccountField: "1003", + utils.Destination: "1002", + utils.SetupTime: time.Date(2017, 12, 1, 14, 25, 0, 0, time.UTC), + utils.Usage: "1m20s", }, } expRouteIDs := []string{"route3", "route2"} @@ -829,14 +811,12 @@ func testV1RouteGetQOSRoutesFiltred2(t *testing.T) { } func testV1RouteGetRouteWithoutFilter(t *testing.T) { - ev := &engine.ArgsGetRoutes{ - CGREvent: &utils.CGREvent{ - Tenant: "cgrates.org", - ID: "testV1RouteGetRouteWithoutFilter", - Event: map[string]interface{}{ - utils.AccountField: "1008", - utils.Destination: "+49", - }, + ev := &utils.CGREvent{ + Tenant: "cgrates.org", + ID: "testV1RouteGetRouteWithoutFilter", + Event: map[string]interface{}{ + utils.AccountField: "1008", + utils.Destination: "+49", }, } eSpls := engine.SortedRoutesList{{ @@ -1154,18 +1134,16 @@ func testV1RoutesOneRouteWithoutDestination(t *testing.T) { t.Error("Unexpected reply returned", result) } - ev := &engine.ArgsGetRoutes{ - CGREvent: &utils.CGREvent{ - Tenant: "cgrates.org", - ID: "testV1RoutesOneRouteWithoutDestination", - Event: map[string]interface{}{ - utils.AccountField: "SpecialCase", - utils.Destination: "+24680", - utils.SetupTime: utils.MetaNow, - utils.Usage: "2m", - }, - APIOpts: map[string]interface{}{utils.OptsRoutesProfilesCount: 1}, + ev := &utils.CGREvent{ + Tenant: "cgrates.org", + ID: "testV1RoutesOneRouteWithoutDestination", + Event: map[string]interface{}{ + utils.AccountField: "SpecialCase", + utils.Destination: "+24680", + utils.SetupTime: utils.MetaNow, + utils.Usage: "2m", }, + APIOpts: map[string]interface{}{utils.OptsRoutesProfileCount: 1}, } eSpls := engine.SortedRoutesList{{ ProfileID: "ROUTE_DESTINATION", @@ -1229,20 +1207,18 @@ func testV1RouteMultipleRouteSameID(t *testing.T) { t.Error("Unexpected reply returned", result) } tNow := time.Now() - ev := &engine.ArgsGetRoutes{ - CGREvent: &utils.CGREvent{ - Tenant: "cgrates.org", - Time: &tNow, - ID: "testV1RouteMultipleRouteSameID", - Event: map[string]interface{}{ - utils.AccountField: "SpecialCase2", - utils.Destination: "+135876", - utils.SetupTime: utils.MetaNow, - utils.Usage: "2m", - "Month": "April", - }, - APIOpts: map[string]interface{}{utils.OptsRoutesProfilesCount: 1}, + ev := &utils.CGREvent{ + Tenant: "cgrates.org", + Time: &tNow, + ID: "testV1RouteMultipleRouteSameID", + Event: map[string]interface{}{ + utils.AccountField: "SpecialCase2", + utils.Destination: "+135876", + utils.SetupTime: utils.MetaNow, + utils.Usage: "2m", + "Month": "April", }, + APIOpts: map[string]interface{}{utils.OptsRoutesProfileCount: 1}, } eSpls := engine.SortedRoutesList{{ ProfileID: "MULTIPLE_ROUTES", @@ -1267,20 +1243,18 @@ func testV1RouteMultipleRouteSameID(t *testing.T) { utils.ToJSON(eSpls), utils.ToJSON(suplsReply)) } - ev = &engine.ArgsGetRoutes{ - CGREvent: &utils.CGREvent{ - Tenant: "cgrates.org", - Time: &tNow, - ID: "testV1RouteMultipleRouteSameID", - Event: map[string]interface{}{ - utils.AccountField: "SpecialCase2", - utils.Destination: "+135876", - utils.SetupTime: utils.MetaNow, - utils.Usage: "2m", - "Month": "May", - }, - APIOpts: map[string]interface{}{utils.OptsRoutesProfilesCount: 1}, + ev = &utils.CGREvent{ + Tenant: "cgrates.org", + Time: &tNow, + ID: "testV1RouteMultipleRouteSameID", + Event: map[string]interface{}{ + utils.AccountField: "SpecialCase2", + utils.Destination: "+135876", + utils.SetupTime: utils.MetaNow, + utils.Usage: "2m", + "Month": "May", }, + APIOpts: map[string]interface{}{utils.OptsRoutesProfileCount: 1}, } eSpls = engine.SortedRoutesList{{ ProfileID: "MULTIPLE_ROUTES", @@ -1365,20 +1339,18 @@ func testV1RouteAccountWithRatingPlan(t *testing.T) { // test for 30 seconds usage // we expect that the route with account to have cost 0 tNow := time.Now() - ev := &engine.ArgsGetRoutes{ - CGREvent: &utils.CGREvent{ - Tenant: "cgrates.org", - Time: &tNow, - ID: "testV1RouteAccountWithRatingPlan", - Event: map[string]interface{}{ - utils.AccountField: "RandomAccount", - utils.Destination: "+135876", - utils.SetupTime: utils.MetaNow, - utils.Usage: "30s", - "EventType": "testV1RouteAccountWithRatingPlan", - }, - APIOpts: map[string]interface{}{utils.OptsRoutesProfilesCount: 1}, + ev := &utils.CGREvent{ + Tenant: "cgrates.org", + Time: &tNow, + ID: "testV1RouteAccountWithRatingPlan", + Event: map[string]interface{}{ + utils.AccountField: "RandomAccount", + utils.Destination: "+135876", + utils.SetupTime: utils.MetaNow, + utils.Usage: "30s", + "EventType": "testV1RouteAccountWithRatingPlan", }, + APIOpts: map[string]interface{}{utils.OptsRoutesProfileCount: 1}, } eSpls := &engine.SortedRoutesList{{ ProfileID: "RouteWithAccAndRP", @@ -1435,20 +1407,18 @@ func testV1RouteAccountWithRatingPlan(t *testing.T) { // test for 60 seconds usage // 30 seconds are covered by account and the remaining will be calculated - ev = &engine.ArgsGetRoutes{ - CGREvent: &utils.CGREvent{ - Tenant: "cgrates.org", - Time: &tNow, - ID: "testV1RouteAccountWithRatingPlan", - Event: map[string]interface{}{ - utils.AccountField: "RandomAccount", - utils.Destination: "+135876", - utils.SetupTime: utils.MetaNow, - utils.Usage: "60s", - "EventType": "testV1RouteAccountWithRatingPlan", - }, - APIOpts: map[string]interface{}{utils.OptsRoutesProfilesCount: 1}, + ev = &utils.CGREvent{ + Tenant: "cgrates.org", + Time: &tNow, + ID: "testV1RouteAccountWithRatingPlan", + Event: map[string]interface{}{ + utils.AccountField: "RandomAccount", + utils.Destination: "+135876", + utils.SetupTime: utils.MetaNow, + utils.Usage: "60s", + "EventType": "testV1RouteAccountWithRatingPlan", }, + APIOpts: map[string]interface{}{utils.OptsRoutesProfileCount: 1}, } eSpls = &engine.SortedRoutesList{{ ProfileID: "RouteWithAccAndRP", @@ -1507,20 +1477,18 @@ func testV1RouteAccountWithRatingPlan(t *testing.T) { // test for 61 seconds usage // 30 seconds are covered by account and the remaining will be calculated - ev = &engine.ArgsGetRoutes{ - CGREvent: &utils.CGREvent{ - Tenant: "cgrates.org", - Time: &tNow, - ID: "testV1RouteAccountWithRatingPlan", - Event: map[string]interface{}{ - utils.AccountField: "RandomAccount", - utils.Destination: "+135876", - utils.SetupTime: utils.MetaNow, - utils.Usage: "1m1s", - "EventType": "testV1RouteAccountWithRatingPlan", - }, - APIOpts: map[string]interface{}{utils.OptsRoutesProfilesCount: 1}, + ev = &utils.CGREvent{ + Tenant: "cgrates.org", + Time: &tNow, + ID: "testV1RouteAccountWithRatingPlan", + Event: map[string]interface{}{ + utils.AccountField: "RandomAccount", + utils.Destination: "+135876", + utils.SetupTime: utils.MetaNow, + utils.Usage: "1m1s", + "EventType": "testV1RouteAccountWithRatingPlan", }, + APIOpts: map[string]interface{}{utils.OptsRoutesProfileCount: 1}, } eSpls = &engine.SortedRoutesList{{ ProfileID: "RouteWithAccAndRP", diff --git a/apier/v1/sessionsv1_it_test.go b/apier/v1/sessionsv1_it_test.go index b578d8838..e63338729 100644 --- a/apier/v1/sessionsv1_it_test.go +++ b/apier/v1/sessionsv1_it_test.go @@ -312,7 +312,7 @@ func testSSv1ItAuthWithDigest(t *testing.T) { utils.SetupTime: time.Date(2018, time.January, 7, 16, 60, 0, 0, time.UTC), utils.Usage: authUsage, }, - APIOpts: map[string]interface{}{utils.OptsRoutesProfilesCount: 1}, + APIOpts: map[string]interface{}{utils.OptsRoutesProfileCount: 1}, }, } var rply sessions.V1AuthorizeReplyWithDigest diff --git a/config/config.go b/config/config.go index 6a8d09790..9f1e164e7 100644 --- a/config/config.go +++ b/config/config.go @@ -153,7 +153,7 @@ func newCGRConfig(config []byte) (cfg *CGRConfig, err error) { cfg.resourceSCfg = &ResourceSConfig{Opts: &ResourcesOpts{}} cfg.statsCfg = &StatSCfg{Opts: &StatsOpts{}} cfg.thresholdSCfg = &ThresholdSCfg{Opts: &ThresholdsOpts{}} - cfg.routeSCfg = new(RouteSCfg) + cfg.routeSCfg = &RouteSCfg{Opts: &RoutesOpts{}} cfg.sureTaxCfg = new(SureTaxCfg) cfg.dispatcherSCfg = new(DispatcherSCfg) cfg.registrarCCfg = new(RegistrarCCfgs) diff --git a/config/config_defaults.go b/config/config_defaults.go index 0bb804382..2f2df9375 100644 --- a/config/config_defaults.go +++ b/config/config_defaults.go @@ -787,7 +787,15 @@ const CGRATES_CFG_JSON = ` "resources_conns": [], // connections to ResourceS for *res sorting, empty to disable functionality: <""|*internal|$rpc_conns_id> "stats_conns": [], // connections to StatS for *stats sorting, empty to disable stats functionality: <""|*internal|$rpc_conns_id> "rals_conns": [], // connections to Rater for calculating cost, empty to disable stats functionality: <""|*internal|$rpc_conns_id> - "default_ratio":1 // default ratio used in case of *load strategy + "default_ratio":1, // default ratio used in case of *load strategy + "opts": { + "*context": "*routes", + "*profileCount": 1, + "*ignoreErrors": false, + "*maxCost": "", + // "*limit": 1, + // "*offset": 1, + }, }, diff --git a/config/config_json_test.go b/config/config_json_test.go index fb21e4814..2c49d95cd 100644 --- a/config/config_json_test.go +++ b/config/config_json_test.go @@ -1178,6 +1178,12 @@ func TestDfRouteSJsonCfg(t *testing.T) { Rals_conns: &[]string{}, Default_ratio: utils.IntPointer(1), Nested_fields: utils.BoolPointer(false), + Opts: &RoutesOptsJson{ + Context: utils.StringPointer(utils.MetaRoutes), + IgnoreErrors: utils.BoolPointer(false), + MaxCost: utils.EmptyString, + ProfileCount: utils.IntPointer(1), + }, } dfCgrJSONCfg, err := NewCgrJsonCfgFromBytes([]byte(CGRATES_CFG_JSON)) if err != nil { diff --git a/config/config_test.go b/config/config_test.go index dc5872cf9..03ae5c1c4 100644 --- a/config/config_test.go +++ b/config/config_test.go @@ -777,6 +777,12 @@ func TestCgrCfgJSONDefaultRouteSCfg(t *testing.T) { StatSConns: []string{}, RALsConns: []string{}, DefaultRatio: 1, + Opts: &RoutesOpts{ + Context: utils.MetaRoutes, + IgnoreErrors: false, + MaxCost: utils.EmptyString, + ProfileCount: 1, + }, } if !reflect.DeepEqual(eSupplSCfg, cgrCfg.routeSCfg) { t.Errorf("received: %+v, expecting: %+v", eSupplSCfg, cgrCfg.routeSCfg) @@ -2069,6 +2075,12 @@ func TestRouteSConfig(t *testing.T) { RALsConns: []string{}, DefaultRatio: 1, NestedFields: false, + Opts: &RoutesOpts{ + Context: utils.MetaRoutes, + IgnoreErrors: false, + MaxCost: utils.EmptyString, + ProfileCount: 1, + }, } cgrConfig := NewDefaultCGRConfig() if err != nil { @@ -4156,6 +4168,12 @@ func TestV1GetConfigRoutes(t *testing.T) { utils.StatSConnsCfg: []string{}, utils.RALsConnsCfg: []string{}, utils.DefaultRatioCfg: 1, + utils.OptsCfg: map[string]interface{}{ + utils.OptsContext: utils.MetaRoutes, + utils.MetaProfileCountCfg: 1, + utils.MetaIgnoreErrorsCfg: false, + utils.MetaMaxCostCfg: utils.EmptyString, + }, }, } cfgCgr := NewDefaultCGRConfig() @@ -4964,7 +4982,7 @@ func TestV1GetConfigAsJSONThresholdS(t *testing.T) { func TestV1GetConfigAsJSONRouteS(t *testing.T) { var reply string - expected := `{"routes":{"attributes_conns":[],"default_ratio":1,"enabled":false,"indexed_selects":true,"nested_fields":false,"prefix_indexed_fields":[],"rals_conns":[],"resources_conns":[],"stats_conns":[],"suffix_indexed_fields":[]}}` + expected := `{"routes":{"attributes_conns":[],"default_ratio":1,"enabled":false,"indexed_selects":true,"nested_fields":false,"opts":{"*context":"*routes","*ignoreErrors":false,"*maxCost":"","*profileCount":1},"prefix_indexed_fields":[],"rals_conns":[],"resources_conns":[],"stats_conns":[],"suffix_indexed_fields":[]}}` cgrCfg := NewDefaultCGRConfig() if err := cgrCfg.V1GetConfigAsJSON(&SectionWithAPIOpts{Section: RouteSJson}, &reply); err != nil { t.Error(err) @@ -5234,7 +5252,7 @@ func TestV1GetConfigAsJSONAllConfig(t *testing.T) { }` var reply string cgrCfg, err := NewCGRConfigFromJSONStringWithDefaults(cfgJSON) - expected := `{"analyzers":{"cleanup_interval":"1h0m0s","db_path":"/var/spool/cgrates/analyzers","enabled":false,"index_type":"*scorch","ttl":"24h0m0s"},"apiban":{"enabled":false,"keys":[]},"apiers":{"attributes_conns":[],"caches_conns":["*internal"],"ees_conns":[],"enabled":false,"scheduler_conns":[]},"asterisk_agent":{"asterisk_conns":[{"address":"127.0.0.1:8088","alias":"","connect_attempts":3,"password":"CGRateS.org","reconnects":5,"user":"cgrates"}],"create_cdr":false,"enabled":false,"sessions_conns":["*birpc_internal"]},"attributes":{"any_context":true,"apiers_conns":[],"enabled":false,"indexed_selects":true,"nested_fields":false,"opts":{"*processRuns":1,"*profileIDs":[],"*profileIgnoreFilters":false,"*profileRuns":0},"prefix_indexed_fields":[],"resources_conns":[],"stats_conns":[],"suffix_indexed_fields":[]},"caches":{"partitions":{"*account_action_plans":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false},"*action_plans":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false},"*action_triggers":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false},"*actions":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false},"*apiban":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false,"ttl":"2m0s"},"*attribute_filter_indexes":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false},"*attribute_profiles":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false},"*caps_events":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false},"*cdr_ids":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false,"ttl":"10m0s"},"*charger_filter_indexes":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false},"*charger_profiles":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false},"*closed_sessions":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false,"ttl":"10s"},"*destinations":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false},"*diameter_messages":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false,"ttl":"3h0m0s"},"*dispatcher_filter_indexes":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false},"*dispatcher_hosts":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false},"*dispatcher_loads":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false},"*dispatcher_profiles":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false},"*dispatcher_routes":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false},"*dispatchers":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false},"*event_charges":{"limit":0,"precache":false,"replicate":false,"static_ttl":false,"ttl":"10s"},"*event_resources":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false},"*filters":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false},"*load_ids":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false},"*rating_plans":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false},"*rating_profiles":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false},"*replication_hosts":{"limit":0,"precache":false,"replicate":false,"static_ttl":false},"*resource_filter_indexes":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false},"*resource_profiles":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false},"*resources":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false},"*reverse_destinations":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false},"*reverse_filter_indexes":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false},"*route_filter_indexes":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false},"*route_profiles":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false},"*rpc_connections":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false},"*rpc_responses":{"limit":0,"precache":false,"replicate":false,"static_ttl":false,"ttl":"2s"},"*shared_groups":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false},"*stat_filter_indexes":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false},"*statqueue_profiles":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false},"*statqueues":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false},"*stir":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false,"ttl":"3h0m0s"},"*threshold_filter_indexes":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false},"*threshold_profiles":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false},"*thresholds":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false},"*timings":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false},"*uch":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false,"ttl":"3h0m0s"}},"replication_conns":[]},"cdrs":{"attributes_conns":[],"chargers_conns":[],"ees_conns":[],"enabled":false,"extra_fields":[],"online_cdr_exports":[],"rals_conns":[],"scheduler_conns":[],"session_cost_retries":5,"stats_conns":[],"store_cdrs":true,"thresholds_conns":[]},"chargers":{"attributes_conns":[],"enabled":false,"indexed_selects":true,"nested_fields":false,"prefix_indexed_fields":[],"suffix_indexed_fields":[]},"configs":{"enabled":false,"root_dir":"/var/spool/cgrates/configs","url":"/configs/"},"cores":{"caps":0,"caps_stats_interval":"0","caps_strategy":"*busy","shutdown_timeout":"1s"},"data_db":{"db_host":"127.0.0.1","db_name":"10","db_password":"","db_port":6379,"db_type":"*redis","db_user":"cgrates","items":{"*account_action_plans":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*accounts":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*action_plans":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*action_triggers":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*actions":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*attribute_filter_indexes":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*attribute_profiles":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*charger_filter_indexes":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*charger_profiles":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*destinations":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*dispatcher_filter_indexes":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*dispatcher_hosts":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*dispatcher_profiles":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*filters":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*load_ids":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*rating_plans":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*rating_profiles":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*resource_filter_indexes":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*resource_profiles":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*resources":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*reverse_destinations":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*reverse_filter_indexes":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*route_filter_indexes":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*route_profiles":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*shared_groups":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*stat_filter_indexes":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*statqueue_profiles":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*statqueues":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*threshold_filter_indexes":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*threshold_profiles":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*thresholds":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*timings":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*versions":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false}},"opts":{"mongoQueryTimeout":"10s","redisCACertificate":"","redisClientCertificate":"","redisClientKey":"","redisCluster":false,"redisClusterOndownDelay":"0","redisClusterSync":"5s","redisSentinel":"","redisTLS":false},"remote_conn_id":"","remote_conns":[],"replication_cache":"","replication_conns":[],"replication_filtered":false},"diameter_agent":{"asr_template":"","concurrent_requests":-1,"dictionaries_path":"/usr/share/cgrates/diameter/dict/","enabled":false,"forced_disconnect":"*none","listen":"127.0.0.1:3868","listen_net":"tcp","origin_host":"CGR-DA","origin_realm":"cgrates.org","product_name":"CGRateS","rar_template":"","request_processors":[],"sessions_conns":["*birpc_internal"],"synced_conn_requests":false,"vendor_id":0},"dispatchers":{"any_subsystem":true,"attributes_conns":[],"enabled":false,"indexed_selects":true,"nested_fields":false,"prefix_indexed_fields":[],"suffix_indexed_fields":[]},"dns_agent":{"enabled":false,"listen":"127.0.0.1:2053","listen_net":"udp","request_processors":[],"sessions_conns":["*internal"],"timezone":""},"ees":{"attributes_conns":[],"cache":{"*file_csv":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false,"ttl":"5s"}},"enabled":false,"exporters":[{"attempts":1,"attribute_context":"","attribute_ids":[],"concurrent_requests":0,"export_path":"/var/spool/cgrates/ees","failed_posts_dir":"/var/spool/cgrates/failed_posts","fields":[],"filters":[],"flags":[],"id":"*default","opts":{},"synchronous":false,"timezone":"","type":"*none"}]},"ers":{"enabled":false,"partial_cache_ttl":"1s","readers":[{"cache_dump_fields":[],"concurrent_requests":1024,"fields":[{"mandatory":true,"path":"*cgreq.ToR","tag":"ToR","type":"*variable","value":"~*req.2"},{"mandatory":true,"path":"*cgreq.OriginID","tag":"OriginID","type":"*variable","value":"~*req.3"},{"mandatory":true,"path":"*cgreq.RequestType","tag":"RequestType","type":"*variable","value":"~*req.4"},{"mandatory":true,"path":"*cgreq.Tenant","tag":"Tenant","type":"*variable","value":"~*req.6"},{"mandatory":true,"path":"*cgreq.Category","tag":"Category","type":"*variable","value":"~*req.7"},{"mandatory":true,"path":"*cgreq.Account","tag":"Account","type":"*variable","value":"~*req.8"},{"mandatory":true,"path":"*cgreq.Subject","tag":"Subject","type":"*variable","value":"~*req.9"},{"mandatory":true,"path":"*cgreq.Destination","tag":"Destination","type":"*variable","value":"~*req.10"},{"mandatory":true,"path":"*cgreq.SetupTime","tag":"SetupTime","type":"*variable","value":"~*req.11"},{"mandatory":true,"path":"*cgreq.AnswerTime","tag":"AnswerTime","type":"*variable","value":"~*req.12"},{"mandatory":true,"path":"*cgreq.Usage","tag":"Usage","type":"*variable","value":"~*req.13"}],"filters":[],"flags":[],"id":"*default","opts":{"csvFieldSeparator":",","csvHeaderDefineChar":":","csvRowLength":0,"natsSubject":"cgrates_cdrs","partialCacheAction":"*none","partialOrderField":"~*req.AnswerTime","xmlRootPath":""},"partial_commit_fields":[],"processed_path":"/var/spool/cgrates/ers/out","run_delay":"0","source_path":"/var/spool/cgrates/ers/in","tenant":"","timezone":"","type":"*none"}],"sessions_conns":["*internal"]},"filters":{"apiers_conns":[],"resources_conns":[],"stats_conns":[]},"freeswitch_agent":{"create_cdr":false,"empty_balance_ann_file":"","empty_balance_context":"","enabled":false,"event_socket_conns":[{"address":"127.0.0.1:8021","alias":"127.0.0.1:8021","password":"ClueCon","reconnects":5}],"extra_fields":"","low_balance_ann_file":"","max_wait_connection":"2s","sessions_conns":["*birpc_internal"],"subscribe_park":true},"general":{"connect_attempts":5,"connect_timeout":"1s","dbdata_encoding":"*msgpack","default_caching":"*reload","default_category":"call","default_request_type":"*rated","default_tenant":"cgrates.org","default_timezone":"Local","digest_equal":":","digest_separator":",","failed_posts_dir":"/var/spool/cgrates/failed_posts","failed_posts_ttl":"5s","locking_timeout":"0","log_level":6,"logger":"*syslog","max_parallel_conns":100,"node_id":"ENGINE1","poster_attempts":3,"reconnects":-1,"reply_timeout":"2s","rounding_decimals":5,"rsr_separator":";","tpexport_dir":"/var/spool/cgrates/tpe"},"http":{"auth_users":{},"client_opts":{"dialFallbackDelay":"300ms","dialKeepAlive":"30s","dialTimeout":"30s","disableCompression":false,"disableKeepAlives":false,"expectContinueTimeout":"0","forceAttemptHttp2":true,"idleConnTimeout":"90s","maxConnsPerHost":0,"maxIdleConns":100,"maxIdleConnsPerHost":2,"responseHeaderTimeout":"0","skipTlsVerify":false,"tlsHandshakeTimeout":"10s"},"freeswitch_cdrs_url":"/freeswitch_json","http_cdrs":"/cdr_http","json_rpc_url":"/jsonrpc","registrars_url":"/registrar","use_basic_auth":false,"ws_url":"/ws"},"http_agent":[],"kamailio_agent":{"create_cdr":false,"enabled":false,"evapi_conns":[{"address":"127.0.0.1:8448","alias":"","reconnects":5}],"sessions_conns":["*birpc_internal"],"timezone":""},"listen":{"http":"127.0.0.1:2080","http_tls":"127.0.0.1:2280","rpc_gob":"127.0.0.1:2013","rpc_gob_tls":"127.0.0.1:2023","rpc_json":"127.0.0.1:2012","rpc_json_tls":"127.0.0.1:2022"},"loader":{"caches_conns":["*localhost"],"data_path":"./","disable_reverse":false,"field_separator":",","gapi_credentials":".gapi/credentials.json","gapi_token":".gapi/token.json","scheduler_conns":["*localhost"],"tpid":""},"loaders":[{"caches_conns":["*internal"],"data":[{"fields":[{"mandatory":true,"path":"Tenant","tag":"TenantID","type":"*variable","value":"~*req.0"},{"mandatory":true,"path":"ID","tag":"ProfileID","type":"*variable","value":"~*req.1"},{"path":"Contexts","tag":"Contexts","type":"*variable","value":"~*req.2"},{"path":"FilterIDs","tag":"FilterIDs","type":"*variable","value":"~*req.3"},{"path":"ActivationInterval","tag":"ActivationInterval","type":"*variable","value":"~*req.4"},{"path":"AttributeFilterIDs","tag":"AttributeFilterIDs","type":"*variable","value":"~*req.5"},{"path":"Path","tag":"Path","type":"*variable","value":"~*req.6"},{"path":"Type","tag":"Type","type":"*variable","value":"~*req.7"},{"path":"Value","tag":"Value","type":"*variable","value":"~*req.8"},{"path":"Blocker","tag":"Blocker","type":"*variable","value":"~*req.9"},{"path":"Weight","tag":"Weight","type":"*variable","value":"~*req.10"}],"file_name":"Attributes.csv","flags":null,"type":"*attributes"},{"fields":[{"mandatory":true,"path":"Tenant","tag":"Tenant","type":"*variable","value":"~*req.0"},{"mandatory":true,"path":"ID","tag":"ID","type":"*variable","value":"~*req.1"},{"path":"Type","tag":"Type","type":"*variable","value":"~*req.2"},{"path":"Element","tag":"Element","type":"*variable","value":"~*req.3"},{"path":"Values","tag":"Values","type":"*variable","value":"~*req.4"},{"path":"ActivationInterval","tag":"ActivationInterval","type":"*variable","value":"~*req.5"}],"file_name":"Filters.csv","flags":null,"type":"*filters"},{"fields":[{"mandatory":true,"path":"Tenant","tag":"Tenant","type":"*variable","value":"~*req.0"},{"mandatory":true,"path":"ID","tag":"ID","type":"*variable","value":"~*req.1"},{"path":"FilterIDs","tag":"FilterIDs","type":"*variable","value":"~*req.2"},{"path":"ActivationInterval","tag":"ActivationInterval","type":"*variable","value":"~*req.3"},{"path":"UsageTTL","tag":"TTL","type":"*variable","value":"~*req.4"},{"path":"Limit","tag":"Limit","type":"*variable","value":"~*req.5"},{"path":"AllocationMessage","tag":"AllocationMessage","type":"*variable","value":"~*req.6"},{"path":"Blocker","tag":"Blocker","type":"*variable","value":"~*req.7"},{"path":"Stored","tag":"Stored","type":"*variable","value":"~*req.8"},{"path":"Weight","tag":"Weight","type":"*variable","value":"~*req.9"},{"path":"ThresholdIDs","tag":"ThresholdIDs","type":"*variable","value":"~*req.10"}],"file_name":"Resources.csv","flags":null,"type":"*resources"},{"fields":[{"mandatory":true,"path":"Tenant","tag":"Tenant","type":"*variable","value":"~*req.0"},{"mandatory":true,"path":"ID","tag":"ID","type":"*variable","value":"~*req.1"},{"path":"FilterIDs","tag":"FilterIDs","type":"*variable","value":"~*req.2"},{"path":"ActivationInterval","tag":"ActivationInterval","type":"*variable","value":"~*req.3"},{"path":"QueueLength","tag":"QueueLength","type":"*variable","value":"~*req.4"},{"path":"TTL","tag":"TTL","type":"*variable","value":"~*req.5"},{"path":"MinItems","tag":"MinItems","type":"*variable","value":"~*req.6"},{"path":"MetricIDs","tag":"MetricIDs","type":"*variable","value":"~*req.7"},{"path":"MetricFilterIDs","tag":"MetricFilterIDs","type":"*variable","value":"~*req.8"},{"path":"Blocker","tag":"Blocker","type":"*variable","value":"~*req.9"},{"path":"Stored","tag":"Stored","type":"*variable","value":"~*req.10"},{"path":"Weight","tag":"Weight","type":"*variable","value":"~*req.11"},{"path":"ThresholdIDs","tag":"ThresholdIDs","type":"*variable","value":"~*req.12"}],"file_name":"Stats.csv","flags":null,"type":"*stats"},{"fields":[{"mandatory":true,"path":"Tenant","tag":"Tenant","type":"*variable","value":"~*req.0"},{"mandatory":true,"path":"ID","tag":"ID","type":"*variable","value":"~*req.1"},{"path":"FilterIDs","tag":"FilterIDs","type":"*variable","value":"~*req.2"},{"path":"ActivationInterval","tag":"ActivationInterval","type":"*variable","value":"~*req.3"},{"path":"MaxHits","tag":"MaxHits","type":"*variable","value":"~*req.4"},{"path":"MinHits","tag":"MinHits","type":"*variable","value":"~*req.5"},{"path":"MinSleep","tag":"MinSleep","type":"*variable","value":"~*req.6"},{"path":"Blocker","tag":"Blocker","type":"*variable","value":"~*req.7"},{"path":"Weight","tag":"Weight","type":"*variable","value":"~*req.8"},{"path":"ActionIDs","tag":"ActionIDs","type":"*variable","value":"~*req.9"},{"path":"Async","tag":"Async","type":"*variable","value":"~*req.10"}],"file_name":"Thresholds.csv","flags":null,"type":"*thresholds"},{"fields":[{"mandatory":true,"path":"Tenant","tag":"Tenant","type":"*variable","value":"~*req.0"},{"mandatory":true,"path":"ID","tag":"ID","type":"*variable","value":"~*req.1"},{"path":"FilterIDs","tag":"FilterIDs","type":"*variable","value":"~*req.2"},{"path":"ActivationInterval","tag":"ActivationInterval","type":"*variable","value":"~*req.3"},{"path":"Sorting","tag":"Sorting","type":"*variable","value":"~*req.4"},{"path":"SortingParameters","tag":"SortingParameters","type":"*variable","value":"~*req.5"},{"path":"RouteID","tag":"RouteID","type":"*variable","value":"~*req.6"},{"path":"RouteFilterIDs","tag":"RouteFilterIDs","type":"*variable","value":"~*req.7"},{"path":"RouteAccountIDs","tag":"RouteAccountIDs","type":"*variable","value":"~*req.8"},{"path":"RouteRatingPlanIDs","tag":"RouteRatingPlanIDs","type":"*variable","value":"~*req.9"},{"path":"RouteResourceIDs","tag":"RouteResourceIDs","type":"*variable","value":"~*req.10"},{"path":"RouteStatIDs","tag":"RouteStatIDs","type":"*variable","value":"~*req.11"},{"path":"RouteWeight","tag":"RouteWeight","type":"*variable","value":"~*req.12"},{"path":"RouteBlocker","tag":"RouteBlocker","type":"*variable","value":"~*req.13"},{"path":"RouteParameters","tag":"RouteParameters","type":"*variable","value":"~*req.14"},{"path":"Weight","tag":"Weight","type":"*variable","value":"~*req.15"}],"file_name":"Routes.csv","flags":null,"type":"*routes"},{"fields":[{"mandatory":true,"path":"Tenant","tag":"Tenant","type":"*variable","value":"~*req.0"},{"mandatory":true,"path":"ID","tag":"ID","type":"*variable","value":"~*req.1"},{"path":"FilterIDs","tag":"FilterIDs","type":"*variable","value":"~*req.2"},{"path":"ActivationInterval","tag":"ActivationInterval","type":"*variable","value":"~*req.3"},{"path":"RunID","tag":"RunID","type":"*variable","value":"~*req.4"},{"path":"AttributeIDs","tag":"AttributeIDs","type":"*variable","value":"~*req.5"},{"path":"Weight","tag":"Weight","type":"*variable","value":"~*req.6"}],"file_name":"Chargers.csv","flags":null,"type":"*chargers"},{"fields":[{"mandatory":true,"path":"Tenant","tag":"Tenant","type":"*variable","value":"~*req.0"},{"mandatory":true,"path":"ID","tag":"ID","type":"*variable","value":"~*req.1"},{"path":"Contexts","tag":"Contexts","type":"*variable","value":"~*req.2"},{"path":"FilterIDs","tag":"FilterIDs","type":"*variable","value":"~*req.3"},{"path":"ActivationInterval","tag":"ActivationInterval","type":"*variable","value":"~*req.4"},{"path":"Strategy","tag":"Strategy","type":"*variable","value":"~*req.5"},{"path":"StrategyParameters","tag":"StrategyParameters","type":"*variable","value":"~*req.6"},{"path":"ConnID","tag":"ConnID","type":"*variable","value":"~*req.7"},{"path":"ConnFilterIDs","tag":"ConnFilterIDs","type":"*variable","value":"~*req.8"},{"path":"ConnWeight","tag":"ConnWeight","type":"*variable","value":"~*req.9"},{"path":"ConnBlocker","tag":"ConnBlocker","type":"*variable","value":"~*req.10"},{"path":"ConnParameters","tag":"ConnParameters","type":"*variable","value":"~*req.11"},{"path":"Weight","tag":"Weight","type":"*variable","value":"~*req.12"}],"file_name":"DispatcherProfiles.csv","flags":null,"type":"*dispatchers"},{"fields":[{"mandatory":true,"path":"Tenant","tag":"Tenant","type":"*variable","value":"~*req.0"},{"mandatory":true,"path":"ID","tag":"ID","type":"*variable","value":"~*req.1"},{"path":"Address","tag":"Address","type":"*variable","value":"~*req.2"},{"path":"Transport","tag":"Transport","type":"*variable","value":"~*req.3"},{"path":"ConnectAttempts","tag":"ConnectAttempts","type":"*variable","value":"~*req.4"},{"path":"Reconnects","tag":"Reconnects","type":"*variable","value":"~*req.5"},{"path":"ConnectTimeout","tag":"ConnectTimeout","type":"*variable","value":"~*req.6"},{"path":"ReplyTimeout","tag":"ReplyTimeout","type":"*variable","value":"~*req.7"},{"path":"TLS","tag":"TLS","type":"*variable","value":"~*req.8"},{"path":"ClientKey","tag":"ClientKey","type":"*variable","value":"~*req.9"},{"path":"ClientCertificate","tag":"ClientCertificate","type":"*variable","value":"~*req.10"},{"path":"CaCertificate","tag":"CaCertificate","type":"*variable","value":"~*req.11"}],"file_name":"DispatcherHosts.csv","flags":null,"type":"*dispatcher_hosts"}],"dry_run":false,"enabled":false,"field_separator":",","id":"*default","lockfile_path":".cgr.lck","run_delay":"0","tenant":"","tp_in_dir":"/var/spool/cgrates/loader/in","tp_out_dir":"/var/spool/cgrates/loader/out"}],"mailer":{"auth_password":"CGRateS.org","auth_user":"cgrates","from_address":"cgr-mailer@localhost.localdomain","server":"localhost"},"migrator":{"out_datadb_encoding":"msgpack","out_datadb_host":"127.0.0.1","out_datadb_name":"10","out_datadb_opts":{"redisCACertificate":"","redisClientCertificate":"","redisClientKey":"","redisCluster":false,"redisClusterOndownDelay":"0","redisClusterSync":"5s","redisSentinel":"","redisTLS":false},"out_datadb_password":"","out_datadb_port":"6379","out_datadb_type":"redis","out_datadb_user":"cgrates","out_stordb_host":"127.0.0.1","out_stordb_name":"cgrates","out_stordb_opts":{},"out_stordb_password":"","out_stordb_port":"3306","out_stordb_type":"mysql","out_stordb_user":"cgrates","users_filters":[]},"radius_agent":{"client_dictionaries":{"*default":"/usr/share/cgrates/radius/dict/"},"client_secrets":{"*default":"CGRateS.org"},"enabled":false,"listen_acct":"127.0.0.1:1813","listen_auth":"127.0.0.1:1812","listen_net":"udp","request_processors":[],"sessions_conns":["*internal"]},"rals":{"balance_rating_subject":{"*any":"*zero1ns","*voice":"*zero1s"},"enabled":false,"max_computed_usage":{"*any":"189h0m0s","*data":"107374182400","*mms":"10000","*sms":"10000","*voice":"72h0m0s"},"max_increments":1000000,"remove_expired":true,"rp_subject_prefix_matching":false,"stats_conns":[],"thresholds_conns":[]},"registrarc":{"dispatchers":{"hosts":[],"refresh_interval":"5m0s","registrars_conns":[]},"rpc":{"hosts":[],"refresh_interval":"5m0s","registrars_conns":[]}},"resources":{"enabled":false,"indexed_selects":true,"nested_fields":false,"opts":{"*units":1,"*usageID":"","*usageTTL":259200000000000},"prefix_indexed_fields":[],"store_interval":"","suffix_indexed_fields":[],"thresholds_conns":[]},"routes":{"attributes_conns":[],"default_ratio":1,"enabled":false,"indexed_selects":true,"nested_fields":false,"prefix_indexed_fields":[],"rals_conns":[],"resources_conns":[],"stats_conns":[],"suffix_indexed_fields":[]},"rpc_conns":{"*bijson_localhost":{"conns":[{"address":"127.0.0.1:2014","transport":"*birpc_json"}],"poolSize":0,"strategy":"*first"},"*birpc_internal":{"conns":[{"address":"*birpc_internal","transport":""}],"poolSize":0,"strategy":"*first"},"*internal":{"conns":[{"address":"*internal","transport":""}],"poolSize":0,"strategy":"*first"},"*localhost":{"conns":[{"address":"127.0.0.1:2012","transport":"*json"}],"poolSize":0,"strategy":"*first"}},"schedulers":{"cdrs_conns":[],"dynaprepaid_actionplans":[],"enabled":false,"filters":[],"stats_conns":[],"thresholds_conns":[]},"sessions":{"alterable_fields":[],"attributes_conns":[],"cdrs_conns":[],"channel_sync_interval":"0","chargers_conns":[],"client_protocol":1,"debit_interval":"0","default_usage":{"*any":"3h0m0s","*data":"1048576","*sms":"1","*voice":"3h0m0s"},"enabled":false,"listen_bigob":"","listen_bijson":"127.0.0.1:2014","min_dur_low_balance":"0","rals_conns":[],"replication_conns":[],"resources_conns":[],"routes_conns":[],"scheduler_conns":[],"session_indexes":[],"session_ttl":"0","stats_conns":[],"stir":{"allowed_attest":["*any"],"default_attest":"A","payload_maxduration":"-1","privatekey_path":"","publickey_path":""},"store_session_costs":false,"terminate_attempts":5,"thresholds_conns":[]},"sip_agent":{"enabled":false,"listen":"127.0.0.1:5060","listen_net":"udp","request_processors":[],"retransmission_timer":1000000000,"sessions_conns":["*internal"],"timezone":""},"stats":{"enabled":false,"indexed_selects":true,"nested_fields":false,"opts":{"*profileIDs":[],"*profileIgnoreFilters":false},"prefix_indexed_fields":[],"store_interval":"","store_uncompressed_limit":0,"suffix_indexed_fields":[],"thresholds_conns":[]},"stor_db":{"db_host":"127.0.0.1","db_name":"cgrates","db_password":"","db_port":3306,"db_type":"*mysql","db_user":"cgrates","items":{"*cdrs":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*session_costs":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*tp_account_actions":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*tp_action_plans":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*tp_action_triggers":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*tp_actions":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*tp_attributes":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*tp_chargers":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*tp_destination_rates":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*tp_destinations":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*tp_dispatcher_hosts":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*tp_dispatcher_profiles":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*tp_filters":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*tp_rates":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*tp_rating_plans":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*tp_rating_profiles":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*tp_resources":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*tp_routes":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*tp_shared_groups":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*tp_stats":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*tp_thresholds":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*tp_timings":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*versions":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false}},"opts":{"mongoQueryTimeout":"10s","mysqlLocation":"Local","postgresSSLMode":"disable","sqlConnMaxLifetime":0,"sqlMaxIdleConns":10,"sqlMaxOpenConns":100},"prefix_indexed_fields":[],"remote_conns":null,"replication_conns":null,"string_indexed_fields":[]},"suretax":{"bill_to_number":"","business_unit":"","client_number":"","client_tracking":"~*req.CGRID","customer_number":"~*req.Subject","include_local_cost":false,"orig_number":"~*req.Subject","p2pplus4":"","p2pzipcode":"","plus4":"","regulatory_code":"03","response_group":"03","response_type":"D4","return_file_code":"0","sales_type_code":"R","tax_exemption_code_list":"","tax_included":"0","tax_situs_rule":"04","term_number":"~*req.Destination","timezone":"UTC","trans_type_code":"010101","unit_type":"00","units":"1","url":"","validation_key":"","zipcode":""},"templates":{"*asr":[{"mandatory":true,"path":"*diamreq.Session-Id","tag":"SessionId","type":"*variable","value":"~*req.Session-Id"},{"mandatory":true,"path":"*diamreq.Origin-Host","tag":"OriginHost","type":"*variable","value":"~*req.Destination-Host"},{"mandatory":true,"path":"*diamreq.Origin-Realm","tag":"OriginRealm","type":"*variable","value":"~*req.Destination-Realm"},{"mandatory":true,"path":"*diamreq.Destination-Realm","tag":"DestinationRealm","type":"*variable","value":"~*req.Origin-Realm"},{"mandatory":true,"path":"*diamreq.Destination-Host","tag":"DestinationHost","type":"*variable","value":"~*req.Origin-Host"},{"mandatory":true,"path":"*diamreq.Auth-Application-Id","tag":"AuthApplicationId","type":"*variable","value":"~*vars.*appid"}],"*cca":[{"mandatory":true,"path":"*rep.Session-Id","tag":"SessionId","type":"*variable","value":"~*req.Session-Id"},{"path":"*rep.Result-Code","tag":"ResultCode","type":"*constant","value":"2001"},{"mandatory":true,"path":"*rep.Origin-Host","tag":"OriginHost","type":"*variable","value":"~*vars.OriginHost"},{"mandatory":true,"path":"*rep.Origin-Realm","tag":"OriginRealm","type":"*variable","value":"~*vars.OriginRealm"},{"mandatory":true,"path":"*rep.Auth-Application-Id","tag":"AuthApplicationId","type":"*variable","value":"~*vars.*appid"},{"mandatory":true,"path":"*rep.CC-Request-Type","tag":"CCRequestType","type":"*variable","value":"~*req.CC-Request-Type"},{"mandatory":true,"path":"*rep.CC-Request-Number","tag":"CCRequestNumber","type":"*variable","value":"~*req.CC-Request-Number"}],"*cdrLog":[{"mandatory":true,"path":"*cdr.ToR","tag":"ToR","type":"*variable","value":"~*req.BalanceType"},{"mandatory":true,"path":"*cdr.OriginHost","tag":"OriginHost","type":"*constant","value":"127.0.0.1"},{"mandatory":true,"path":"*cdr.RequestType","tag":"RequestType","type":"*constant","value":"*none"},{"mandatory":true,"path":"*cdr.Tenant","tag":"Tenant","type":"*variable","value":"~*req.Tenant"},{"mandatory":true,"path":"*cdr.Account","tag":"Account","type":"*variable","value":"~*req.Account"},{"mandatory":true,"path":"*cdr.Subject","tag":"Subject","type":"*variable","value":"~*req.Account"},{"mandatory":true,"path":"*cdr.Cost","tag":"Cost","type":"*variable","value":"~*req.Cost"},{"mandatory":true,"path":"*cdr.Source","tag":"Source","type":"*constant","value":"*cdrLog"},{"mandatory":true,"path":"*cdr.Usage","tag":"Usage","type":"*constant","value":"1"},{"mandatory":true,"path":"*cdr.RunID","tag":"RunID","type":"*variable","value":"~*req.ActionType"},{"mandatory":true,"path":"*cdr.SetupTime","tag":"SetupTime","type":"*constant","value":"*now"},{"mandatory":true,"path":"*cdr.AnswerTime","tag":"AnswerTime","type":"*constant","value":"*now"},{"mandatory":true,"path":"*cdr.PreRated","tag":"PreRated","type":"*constant","value":"true"}],"*err":[{"mandatory":true,"path":"*rep.Session-Id","tag":"SessionId","type":"*variable","value":"~*req.Session-Id"},{"mandatory":true,"path":"*rep.Origin-Host","tag":"OriginHost","type":"*variable","value":"~*vars.OriginHost"},{"mandatory":true,"path":"*rep.Origin-Realm","tag":"OriginRealm","type":"*variable","value":"~*vars.OriginRealm"}],"*errSip":[{"mandatory":true,"path":"*rep.Request","tag":"Request","type":"*constant","value":"SIP/2.0 500 Internal Server Error"}],"*rar":[{"mandatory":true,"path":"*diamreq.Session-Id","tag":"SessionId","type":"*variable","value":"~*req.Session-Id"},{"mandatory":true,"path":"*diamreq.Origin-Host","tag":"OriginHost","type":"*variable","value":"~*req.Destination-Host"},{"mandatory":true,"path":"*diamreq.Origin-Realm","tag":"OriginRealm","type":"*variable","value":"~*req.Destination-Realm"},{"mandatory":true,"path":"*diamreq.Destination-Realm","tag":"DestinationRealm","type":"*variable","value":"~*req.Origin-Realm"},{"mandatory":true,"path":"*diamreq.Destination-Host","tag":"DestinationHost","type":"*variable","value":"~*req.Origin-Host"},{"mandatory":true,"path":"*diamreq.Auth-Application-Id","tag":"AuthApplicationId","type":"*variable","value":"~*vars.*appid"},{"path":"*diamreq.Re-Auth-Request-Type","tag":"ReAuthRequestType","type":"*constant","value":"0"}]},"thresholds":{"enabled":false,"indexed_selects":true,"nested_fields":false,"opts":{"*profileIDs":[],"*profileIgnoreFilters":false},"prefix_indexed_fields":[],"store_interval":"","suffix_indexed_fields":[]},"tls":{"ca_certificate":"","client_certificate":"","client_key":"","server_certificate":"","server_key":"","server_name":"","server_policy":4}}` + expected := `{"analyzers":{"cleanup_interval":"1h0m0s","db_path":"/var/spool/cgrates/analyzers","enabled":false,"index_type":"*scorch","ttl":"24h0m0s"},"apiban":{"enabled":false,"keys":[]},"apiers":{"attributes_conns":[],"caches_conns":["*internal"],"ees_conns":[],"enabled":false,"scheduler_conns":[]},"asterisk_agent":{"asterisk_conns":[{"address":"127.0.0.1:8088","alias":"","connect_attempts":3,"password":"CGRateS.org","reconnects":5,"user":"cgrates"}],"create_cdr":false,"enabled":false,"sessions_conns":["*birpc_internal"]},"attributes":{"any_context":true,"apiers_conns":[],"enabled":false,"indexed_selects":true,"nested_fields":false,"opts":{"*processRuns":1,"*profileIDs":[],"*profileIgnoreFilters":false,"*profileRuns":0},"prefix_indexed_fields":[],"resources_conns":[],"stats_conns":[],"suffix_indexed_fields":[]},"caches":{"partitions":{"*account_action_plans":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false},"*action_plans":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false},"*action_triggers":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false},"*actions":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false},"*apiban":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false,"ttl":"2m0s"},"*attribute_filter_indexes":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false},"*attribute_profiles":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false},"*caps_events":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false},"*cdr_ids":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false,"ttl":"10m0s"},"*charger_filter_indexes":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false},"*charger_profiles":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false},"*closed_sessions":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false,"ttl":"10s"},"*destinations":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false},"*diameter_messages":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false,"ttl":"3h0m0s"},"*dispatcher_filter_indexes":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false},"*dispatcher_hosts":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false},"*dispatcher_loads":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false},"*dispatcher_profiles":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false},"*dispatcher_routes":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false},"*dispatchers":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false},"*event_charges":{"limit":0,"precache":false,"replicate":false,"static_ttl":false,"ttl":"10s"},"*event_resources":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false},"*filters":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false},"*load_ids":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false},"*rating_plans":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false},"*rating_profiles":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false},"*replication_hosts":{"limit":0,"precache":false,"replicate":false,"static_ttl":false},"*resource_filter_indexes":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false},"*resource_profiles":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false},"*resources":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false},"*reverse_destinations":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false},"*reverse_filter_indexes":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false},"*route_filter_indexes":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false},"*route_profiles":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false},"*rpc_connections":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false},"*rpc_responses":{"limit":0,"precache":false,"replicate":false,"static_ttl":false,"ttl":"2s"},"*shared_groups":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false},"*stat_filter_indexes":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false},"*statqueue_profiles":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false},"*statqueues":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false},"*stir":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false,"ttl":"3h0m0s"},"*threshold_filter_indexes":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false},"*threshold_profiles":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false},"*thresholds":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false},"*timings":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false},"*uch":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false,"ttl":"3h0m0s"}},"replication_conns":[]},"cdrs":{"attributes_conns":[],"chargers_conns":[],"ees_conns":[],"enabled":false,"extra_fields":[],"online_cdr_exports":[],"rals_conns":[],"scheduler_conns":[],"session_cost_retries":5,"stats_conns":[],"store_cdrs":true,"thresholds_conns":[]},"chargers":{"attributes_conns":[],"enabled":false,"indexed_selects":true,"nested_fields":false,"prefix_indexed_fields":[],"suffix_indexed_fields":[]},"configs":{"enabled":false,"root_dir":"/var/spool/cgrates/configs","url":"/configs/"},"cores":{"caps":0,"caps_stats_interval":"0","caps_strategy":"*busy","shutdown_timeout":"1s"},"data_db":{"db_host":"127.0.0.1","db_name":"10","db_password":"","db_port":6379,"db_type":"*redis","db_user":"cgrates","items":{"*account_action_plans":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*accounts":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*action_plans":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*action_triggers":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*actions":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*attribute_filter_indexes":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*attribute_profiles":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*charger_filter_indexes":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*charger_profiles":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*destinations":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*dispatcher_filter_indexes":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*dispatcher_hosts":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*dispatcher_profiles":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*filters":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*load_ids":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*rating_plans":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*rating_profiles":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*resource_filter_indexes":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*resource_profiles":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*resources":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*reverse_destinations":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*reverse_filter_indexes":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*route_filter_indexes":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*route_profiles":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*shared_groups":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*stat_filter_indexes":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*statqueue_profiles":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*statqueues":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*threshold_filter_indexes":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*threshold_profiles":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*thresholds":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*timings":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*versions":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false}},"opts":{"mongoQueryTimeout":"10s","redisCACertificate":"","redisClientCertificate":"","redisClientKey":"","redisCluster":false,"redisClusterOndownDelay":"0","redisClusterSync":"5s","redisSentinel":"","redisTLS":false},"remote_conn_id":"","remote_conns":[],"replication_cache":"","replication_conns":[],"replication_filtered":false},"diameter_agent":{"asr_template":"","concurrent_requests":-1,"dictionaries_path":"/usr/share/cgrates/diameter/dict/","enabled":false,"forced_disconnect":"*none","listen":"127.0.0.1:3868","listen_net":"tcp","origin_host":"CGR-DA","origin_realm":"cgrates.org","product_name":"CGRateS","rar_template":"","request_processors":[],"sessions_conns":["*birpc_internal"],"synced_conn_requests":false,"vendor_id":0},"dispatchers":{"any_subsystem":true,"attributes_conns":[],"enabled":false,"indexed_selects":true,"nested_fields":false,"prefix_indexed_fields":[],"suffix_indexed_fields":[]},"dns_agent":{"enabled":false,"listen":"127.0.0.1:2053","listen_net":"udp","request_processors":[],"sessions_conns":["*internal"],"timezone":""},"ees":{"attributes_conns":[],"cache":{"*file_csv":{"limit":-1,"precache":false,"replicate":false,"static_ttl":false,"ttl":"5s"}},"enabled":false,"exporters":[{"attempts":1,"attribute_context":"","attribute_ids":[],"concurrent_requests":0,"export_path":"/var/spool/cgrates/ees","failed_posts_dir":"/var/spool/cgrates/failed_posts","fields":[],"filters":[],"flags":[],"id":"*default","opts":{},"synchronous":false,"timezone":"","type":"*none"}]},"ers":{"enabled":false,"partial_cache_ttl":"1s","readers":[{"cache_dump_fields":[],"concurrent_requests":1024,"fields":[{"mandatory":true,"path":"*cgreq.ToR","tag":"ToR","type":"*variable","value":"~*req.2"},{"mandatory":true,"path":"*cgreq.OriginID","tag":"OriginID","type":"*variable","value":"~*req.3"},{"mandatory":true,"path":"*cgreq.RequestType","tag":"RequestType","type":"*variable","value":"~*req.4"},{"mandatory":true,"path":"*cgreq.Tenant","tag":"Tenant","type":"*variable","value":"~*req.6"},{"mandatory":true,"path":"*cgreq.Category","tag":"Category","type":"*variable","value":"~*req.7"},{"mandatory":true,"path":"*cgreq.Account","tag":"Account","type":"*variable","value":"~*req.8"},{"mandatory":true,"path":"*cgreq.Subject","tag":"Subject","type":"*variable","value":"~*req.9"},{"mandatory":true,"path":"*cgreq.Destination","tag":"Destination","type":"*variable","value":"~*req.10"},{"mandatory":true,"path":"*cgreq.SetupTime","tag":"SetupTime","type":"*variable","value":"~*req.11"},{"mandatory":true,"path":"*cgreq.AnswerTime","tag":"AnswerTime","type":"*variable","value":"~*req.12"},{"mandatory":true,"path":"*cgreq.Usage","tag":"Usage","type":"*variable","value":"~*req.13"}],"filters":[],"flags":[],"id":"*default","opts":{"csvFieldSeparator":",","csvHeaderDefineChar":":","csvRowLength":0,"natsSubject":"cgrates_cdrs","partialCacheAction":"*none","partialOrderField":"~*req.AnswerTime","xmlRootPath":""},"partial_commit_fields":[],"processed_path":"/var/spool/cgrates/ers/out","run_delay":"0","source_path":"/var/spool/cgrates/ers/in","tenant":"","timezone":"","type":"*none"}],"sessions_conns":["*internal"]},"filters":{"apiers_conns":[],"resources_conns":[],"stats_conns":[]},"freeswitch_agent":{"create_cdr":false,"empty_balance_ann_file":"","empty_balance_context":"","enabled":false,"event_socket_conns":[{"address":"127.0.0.1:8021","alias":"127.0.0.1:8021","password":"ClueCon","reconnects":5}],"extra_fields":"","low_balance_ann_file":"","max_wait_connection":"2s","sessions_conns":["*birpc_internal"],"subscribe_park":true},"general":{"connect_attempts":5,"connect_timeout":"1s","dbdata_encoding":"*msgpack","default_caching":"*reload","default_category":"call","default_request_type":"*rated","default_tenant":"cgrates.org","default_timezone":"Local","digest_equal":":","digest_separator":",","failed_posts_dir":"/var/spool/cgrates/failed_posts","failed_posts_ttl":"5s","locking_timeout":"0","log_level":6,"logger":"*syslog","max_parallel_conns":100,"node_id":"ENGINE1","poster_attempts":3,"reconnects":-1,"reply_timeout":"2s","rounding_decimals":5,"rsr_separator":";","tpexport_dir":"/var/spool/cgrates/tpe"},"http":{"auth_users":{},"client_opts":{"dialFallbackDelay":"300ms","dialKeepAlive":"30s","dialTimeout":"30s","disableCompression":false,"disableKeepAlives":false,"expectContinueTimeout":"0","forceAttemptHttp2":true,"idleConnTimeout":"90s","maxConnsPerHost":0,"maxIdleConns":100,"maxIdleConnsPerHost":2,"responseHeaderTimeout":"0","skipTlsVerify":false,"tlsHandshakeTimeout":"10s"},"freeswitch_cdrs_url":"/freeswitch_json","http_cdrs":"/cdr_http","json_rpc_url":"/jsonrpc","registrars_url":"/registrar","use_basic_auth":false,"ws_url":"/ws"},"http_agent":[],"kamailio_agent":{"create_cdr":false,"enabled":false,"evapi_conns":[{"address":"127.0.0.1:8448","alias":"","reconnects":5}],"sessions_conns":["*birpc_internal"],"timezone":""},"listen":{"http":"127.0.0.1:2080","http_tls":"127.0.0.1:2280","rpc_gob":"127.0.0.1:2013","rpc_gob_tls":"127.0.0.1:2023","rpc_json":"127.0.0.1:2012","rpc_json_tls":"127.0.0.1:2022"},"loader":{"caches_conns":["*localhost"],"data_path":"./","disable_reverse":false,"field_separator":",","gapi_credentials":".gapi/credentials.json","gapi_token":".gapi/token.json","scheduler_conns":["*localhost"],"tpid":""},"loaders":[{"caches_conns":["*internal"],"data":[{"fields":[{"mandatory":true,"path":"Tenant","tag":"TenantID","type":"*variable","value":"~*req.0"},{"mandatory":true,"path":"ID","tag":"ProfileID","type":"*variable","value":"~*req.1"},{"path":"Contexts","tag":"Contexts","type":"*variable","value":"~*req.2"},{"path":"FilterIDs","tag":"FilterIDs","type":"*variable","value":"~*req.3"},{"path":"ActivationInterval","tag":"ActivationInterval","type":"*variable","value":"~*req.4"},{"path":"AttributeFilterIDs","tag":"AttributeFilterIDs","type":"*variable","value":"~*req.5"},{"path":"Path","tag":"Path","type":"*variable","value":"~*req.6"},{"path":"Type","tag":"Type","type":"*variable","value":"~*req.7"},{"path":"Value","tag":"Value","type":"*variable","value":"~*req.8"},{"path":"Blocker","tag":"Blocker","type":"*variable","value":"~*req.9"},{"path":"Weight","tag":"Weight","type":"*variable","value":"~*req.10"}],"file_name":"Attributes.csv","flags":null,"type":"*attributes"},{"fields":[{"mandatory":true,"path":"Tenant","tag":"Tenant","type":"*variable","value":"~*req.0"},{"mandatory":true,"path":"ID","tag":"ID","type":"*variable","value":"~*req.1"},{"path":"Type","tag":"Type","type":"*variable","value":"~*req.2"},{"path":"Element","tag":"Element","type":"*variable","value":"~*req.3"},{"path":"Values","tag":"Values","type":"*variable","value":"~*req.4"},{"path":"ActivationInterval","tag":"ActivationInterval","type":"*variable","value":"~*req.5"}],"file_name":"Filters.csv","flags":null,"type":"*filters"},{"fields":[{"mandatory":true,"path":"Tenant","tag":"Tenant","type":"*variable","value":"~*req.0"},{"mandatory":true,"path":"ID","tag":"ID","type":"*variable","value":"~*req.1"},{"path":"FilterIDs","tag":"FilterIDs","type":"*variable","value":"~*req.2"},{"path":"ActivationInterval","tag":"ActivationInterval","type":"*variable","value":"~*req.3"},{"path":"UsageTTL","tag":"TTL","type":"*variable","value":"~*req.4"},{"path":"Limit","tag":"Limit","type":"*variable","value":"~*req.5"},{"path":"AllocationMessage","tag":"AllocationMessage","type":"*variable","value":"~*req.6"},{"path":"Blocker","tag":"Blocker","type":"*variable","value":"~*req.7"},{"path":"Stored","tag":"Stored","type":"*variable","value":"~*req.8"},{"path":"Weight","tag":"Weight","type":"*variable","value":"~*req.9"},{"path":"ThresholdIDs","tag":"ThresholdIDs","type":"*variable","value":"~*req.10"}],"file_name":"Resources.csv","flags":null,"type":"*resources"},{"fields":[{"mandatory":true,"path":"Tenant","tag":"Tenant","type":"*variable","value":"~*req.0"},{"mandatory":true,"path":"ID","tag":"ID","type":"*variable","value":"~*req.1"},{"path":"FilterIDs","tag":"FilterIDs","type":"*variable","value":"~*req.2"},{"path":"ActivationInterval","tag":"ActivationInterval","type":"*variable","value":"~*req.3"},{"path":"QueueLength","tag":"QueueLength","type":"*variable","value":"~*req.4"},{"path":"TTL","tag":"TTL","type":"*variable","value":"~*req.5"},{"path":"MinItems","tag":"MinItems","type":"*variable","value":"~*req.6"},{"path":"MetricIDs","tag":"MetricIDs","type":"*variable","value":"~*req.7"},{"path":"MetricFilterIDs","tag":"MetricFilterIDs","type":"*variable","value":"~*req.8"},{"path":"Blocker","tag":"Blocker","type":"*variable","value":"~*req.9"},{"path":"Stored","tag":"Stored","type":"*variable","value":"~*req.10"},{"path":"Weight","tag":"Weight","type":"*variable","value":"~*req.11"},{"path":"ThresholdIDs","tag":"ThresholdIDs","type":"*variable","value":"~*req.12"}],"file_name":"Stats.csv","flags":null,"type":"*stats"},{"fields":[{"mandatory":true,"path":"Tenant","tag":"Tenant","type":"*variable","value":"~*req.0"},{"mandatory":true,"path":"ID","tag":"ID","type":"*variable","value":"~*req.1"},{"path":"FilterIDs","tag":"FilterIDs","type":"*variable","value":"~*req.2"},{"path":"ActivationInterval","tag":"ActivationInterval","type":"*variable","value":"~*req.3"},{"path":"MaxHits","tag":"MaxHits","type":"*variable","value":"~*req.4"},{"path":"MinHits","tag":"MinHits","type":"*variable","value":"~*req.5"},{"path":"MinSleep","tag":"MinSleep","type":"*variable","value":"~*req.6"},{"path":"Blocker","tag":"Blocker","type":"*variable","value":"~*req.7"},{"path":"Weight","tag":"Weight","type":"*variable","value":"~*req.8"},{"path":"ActionIDs","tag":"ActionIDs","type":"*variable","value":"~*req.9"},{"path":"Async","tag":"Async","type":"*variable","value":"~*req.10"}],"file_name":"Thresholds.csv","flags":null,"type":"*thresholds"},{"fields":[{"mandatory":true,"path":"Tenant","tag":"Tenant","type":"*variable","value":"~*req.0"},{"mandatory":true,"path":"ID","tag":"ID","type":"*variable","value":"~*req.1"},{"path":"FilterIDs","tag":"FilterIDs","type":"*variable","value":"~*req.2"},{"path":"ActivationInterval","tag":"ActivationInterval","type":"*variable","value":"~*req.3"},{"path":"Sorting","tag":"Sorting","type":"*variable","value":"~*req.4"},{"path":"SortingParameters","tag":"SortingParameters","type":"*variable","value":"~*req.5"},{"path":"RouteID","tag":"RouteID","type":"*variable","value":"~*req.6"},{"path":"RouteFilterIDs","tag":"RouteFilterIDs","type":"*variable","value":"~*req.7"},{"path":"RouteAccountIDs","tag":"RouteAccountIDs","type":"*variable","value":"~*req.8"},{"path":"RouteRatingPlanIDs","tag":"RouteRatingPlanIDs","type":"*variable","value":"~*req.9"},{"path":"RouteResourceIDs","tag":"RouteResourceIDs","type":"*variable","value":"~*req.10"},{"path":"RouteStatIDs","tag":"RouteStatIDs","type":"*variable","value":"~*req.11"},{"path":"RouteWeight","tag":"RouteWeight","type":"*variable","value":"~*req.12"},{"path":"RouteBlocker","tag":"RouteBlocker","type":"*variable","value":"~*req.13"},{"path":"RouteParameters","tag":"RouteParameters","type":"*variable","value":"~*req.14"},{"path":"Weight","tag":"Weight","type":"*variable","value":"~*req.15"}],"file_name":"Routes.csv","flags":null,"type":"*routes"},{"fields":[{"mandatory":true,"path":"Tenant","tag":"Tenant","type":"*variable","value":"~*req.0"},{"mandatory":true,"path":"ID","tag":"ID","type":"*variable","value":"~*req.1"},{"path":"FilterIDs","tag":"FilterIDs","type":"*variable","value":"~*req.2"},{"path":"ActivationInterval","tag":"ActivationInterval","type":"*variable","value":"~*req.3"},{"path":"RunID","tag":"RunID","type":"*variable","value":"~*req.4"},{"path":"AttributeIDs","tag":"AttributeIDs","type":"*variable","value":"~*req.5"},{"path":"Weight","tag":"Weight","type":"*variable","value":"~*req.6"}],"file_name":"Chargers.csv","flags":null,"type":"*chargers"},{"fields":[{"mandatory":true,"path":"Tenant","tag":"Tenant","type":"*variable","value":"~*req.0"},{"mandatory":true,"path":"ID","tag":"ID","type":"*variable","value":"~*req.1"},{"path":"Contexts","tag":"Contexts","type":"*variable","value":"~*req.2"},{"path":"FilterIDs","tag":"FilterIDs","type":"*variable","value":"~*req.3"},{"path":"ActivationInterval","tag":"ActivationInterval","type":"*variable","value":"~*req.4"},{"path":"Strategy","tag":"Strategy","type":"*variable","value":"~*req.5"},{"path":"StrategyParameters","tag":"StrategyParameters","type":"*variable","value":"~*req.6"},{"path":"ConnID","tag":"ConnID","type":"*variable","value":"~*req.7"},{"path":"ConnFilterIDs","tag":"ConnFilterIDs","type":"*variable","value":"~*req.8"},{"path":"ConnWeight","tag":"ConnWeight","type":"*variable","value":"~*req.9"},{"path":"ConnBlocker","tag":"ConnBlocker","type":"*variable","value":"~*req.10"},{"path":"ConnParameters","tag":"ConnParameters","type":"*variable","value":"~*req.11"},{"path":"Weight","tag":"Weight","type":"*variable","value":"~*req.12"}],"file_name":"DispatcherProfiles.csv","flags":null,"type":"*dispatchers"},{"fields":[{"mandatory":true,"path":"Tenant","tag":"Tenant","type":"*variable","value":"~*req.0"},{"mandatory":true,"path":"ID","tag":"ID","type":"*variable","value":"~*req.1"},{"path":"Address","tag":"Address","type":"*variable","value":"~*req.2"},{"path":"Transport","tag":"Transport","type":"*variable","value":"~*req.3"},{"path":"ConnectAttempts","tag":"ConnectAttempts","type":"*variable","value":"~*req.4"},{"path":"Reconnects","tag":"Reconnects","type":"*variable","value":"~*req.5"},{"path":"ConnectTimeout","tag":"ConnectTimeout","type":"*variable","value":"~*req.6"},{"path":"ReplyTimeout","tag":"ReplyTimeout","type":"*variable","value":"~*req.7"},{"path":"TLS","tag":"TLS","type":"*variable","value":"~*req.8"},{"path":"ClientKey","tag":"ClientKey","type":"*variable","value":"~*req.9"},{"path":"ClientCertificate","tag":"ClientCertificate","type":"*variable","value":"~*req.10"},{"path":"CaCertificate","tag":"CaCertificate","type":"*variable","value":"~*req.11"}],"file_name":"DispatcherHosts.csv","flags":null,"type":"*dispatcher_hosts"}],"dry_run":false,"enabled":false,"field_separator":",","id":"*default","lockfile_path":".cgr.lck","run_delay":"0","tenant":"","tp_in_dir":"/var/spool/cgrates/loader/in","tp_out_dir":"/var/spool/cgrates/loader/out"}],"mailer":{"auth_password":"CGRateS.org","auth_user":"cgrates","from_address":"cgr-mailer@localhost.localdomain","server":"localhost"},"migrator":{"out_datadb_encoding":"msgpack","out_datadb_host":"127.0.0.1","out_datadb_name":"10","out_datadb_opts":{"redisCACertificate":"","redisClientCertificate":"","redisClientKey":"","redisCluster":false,"redisClusterOndownDelay":"0","redisClusterSync":"5s","redisSentinel":"","redisTLS":false},"out_datadb_password":"","out_datadb_port":"6379","out_datadb_type":"redis","out_datadb_user":"cgrates","out_stordb_host":"127.0.0.1","out_stordb_name":"cgrates","out_stordb_opts":{},"out_stordb_password":"","out_stordb_port":"3306","out_stordb_type":"mysql","out_stordb_user":"cgrates","users_filters":[]},"radius_agent":{"client_dictionaries":{"*default":"/usr/share/cgrates/radius/dict/"},"client_secrets":{"*default":"CGRateS.org"},"enabled":false,"listen_acct":"127.0.0.1:1813","listen_auth":"127.0.0.1:1812","listen_net":"udp","request_processors":[],"sessions_conns":["*internal"]},"rals":{"balance_rating_subject":{"*any":"*zero1ns","*voice":"*zero1s"},"enabled":false,"max_computed_usage":{"*any":"189h0m0s","*data":"107374182400","*mms":"10000","*sms":"10000","*voice":"72h0m0s"},"max_increments":1000000,"remove_expired":true,"rp_subject_prefix_matching":false,"stats_conns":[],"thresholds_conns":[]},"registrarc":{"dispatchers":{"hosts":[],"refresh_interval":"5m0s","registrars_conns":[]},"rpc":{"hosts":[],"refresh_interval":"5m0s","registrars_conns":[]}},"resources":{"enabled":false,"indexed_selects":true,"nested_fields":false,"opts":{"*units":1,"*usageID":"","*usageTTL":259200000000000},"prefix_indexed_fields":[],"store_interval":"","suffix_indexed_fields":[],"thresholds_conns":[]},"routes":{"attributes_conns":[],"default_ratio":1,"enabled":false,"indexed_selects":true,"nested_fields":false,"opts":{"*context":"*routes","*ignoreErrors":false,"*maxCost":"","*profileCount":1},"prefix_indexed_fields":[],"rals_conns":[],"resources_conns":[],"stats_conns":[],"suffix_indexed_fields":[]},"rpc_conns":{"*bijson_localhost":{"conns":[{"address":"127.0.0.1:2014","transport":"*birpc_json"}],"poolSize":0,"strategy":"*first"},"*birpc_internal":{"conns":[{"address":"*birpc_internal","transport":""}],"poolSize":0,"strategy":"*first"},"*internal":{"conns":[{"address":"*internal","transport":""}],"poolSize":0,"strategy":"*first"},"*localhost":{"conns":[{"address":"127.0.0.1:2012","transport":"*json"}],"poolSize":0,"strategy":"*first"}},"schedulers":{"cdrs_conns":[],"dynaprepaid_actionplans":[],"enabled":false,"filters":[],"stats_conns":[],"thresholds_conns":[]},"sessions":{"alterable_fields":[],"attributes_conns":[],"cdrs_conns":[],"channel_sync_interval":"0","chargers_conns":[],"client_protocol":1,"debit_interval":"0","default_usage":{"*any":"3h0m0s","*data":"1048576","*sms":"1","*voice":"3h0m0s"},"enabled":false,"listen_bigob":"","listen_bijson":"127.0.0.1:2014","min_dur_low_balance":"0","rals_conns":[],"replication_conns":[],"resources_conns":[],"routes_conns":[],"scheduler_conns":[],"session_indexes":[],"session_ttl":"0","stats_conns":[],"stir":{"allowed_attest":["*any"],"default_attest":"A","payload_maxduration":"-1","privatekey_path":"","publickey_path":""},"store_session_costs":false,"terminate_attempts":5,"thresholds_conns":[]},"sip_agent":{"enabled":false,"listen":"127.0.0.1:5060","listen_net":"udp","request_processors":[],"retransmission_timer":1000000000,"sessions_conns":["*internal"],"timezone":""},"stats":{"enabled":false,"indexed_selects":true,"nested_fields":false,"opts":{"*profileIDs":[],"*profileIgnoreFilters":false},"prefix_indexed_fields":[],"store_interval":"","store_uncompressed_limit":0,"suffix_indexed_fields":[],"thresholds_conns":[]},"stor_db":{"db_host":"127.0.0.1","db_name":"cgrates","db_password":"","db_port":3306,"db_type":"*mysql","db_user":"cgrates","items":{"*cdrs":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*session_costs":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*tp_account_actions":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*tp_action_plans":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*tp_action_triggers":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*tp_actions":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*tp_attributes":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*tp_chargers":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*tp_destination_rates":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*tp_destinations":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*tp_dispatcher_hosts":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*tp_dispatcher_profiles":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*tp_filters":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*tp_rates":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*tp_rating_plans":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*tp_rating_profiles":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*tp_resources":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*tp_routes":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*tp_shared_groups":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*tp_stats":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*tp_thresholds":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*tp_timings":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false},"*versions":{"limit":-1,"remote":false,"replicate":false,"static_ttl":false}},"opts":{"mongoQueryTimeout":"10s","mysqlLocation":"Local","postgresSSLMode":"disable","sqlConnMaxLifetime":0,"sqlMaxIdleConns":10,"sqlMaxOpenConns":100},"prefix_indexed_fields":[],"remote_conns":null,"replication_conns":null,"string_indexed_fields":[]},"suretax":{"bill_to_number":"","business_unit":"","client_number":"","client_tracking":"~*req.CGRID","customer_number":"~*req.Subject","include_local_cost":false,"orig_number":"~*req.Subject","p2pplus4":"","p2pzipcode":"","plus4":"","regulatory_code":"03","response_group":"03","response_type":"D4","return_file_code":"0","sales_type_code":"R","tax_exemption_code_list":"","tax_included":"0","tax_situs_rule":"04","term_number":"~*req.Destination","timezone":"UTC","trans_type_code":"010101","unit_type":"00","units":"1","url":"","validation_key":"","zipcode":""},"templates":{"*asr":[{"mandatory":true,"path":"*diamreq.Session-Id","tag":"SessionId","type":"*variable","value":"~*req.Session-Id"},{"mandatory":true,"path":"*diamreq.Origin-Host","tag":"OriginHost","type":"*variable","value":"~*req.Destination-Host"},{"mandatory":true,"path":"*diamreq.Origin-Realm","tag":"OriginRealm","type":"*variable","value":"~*req.Destination-Realm"},{"mandatory":true,"path":"*diamreq.Destination-Realm","tag":"DestinationRealm","type":"*variable","value":"~*req.Origin-Realm"},{"mandatory":true,"path":"*diamreq.Destination-Host","tag":"DestinationHost","type":"*variable","value":"~*req.Origin-Host"},{"mandatory":true,"path":"*diamreq.Auth-Application-Id","tag":"AuthApplicationId","type":"*variable","value":"~*vars.*appid"}],"*cca":[{"mandatory":true,"path":"*rep.Session-Id","tag":"SessionId","type":"*variable","value":"~*req.Session-Id"},{"path":"*rep.Result-Code","tag":"ResultCode","type":"*constant","value":"2001"},{"mandatory":true,"path":"*rep.Origin-Host","tag":"OriginHost","type":"*variable","value":"~*vars.OriginHost"},{"mandatory":true,"path":"*rep.Origin-Realm","tag":"OriginRealm","type":"*variable","value":"~*vars.OriginRealm"},{"mandatory":true,"path":"*rep.Auth-Application-Id","tag":"AuthApplicationId","type":"*variable","value":"~*vars.*appid"},{"mandatory":true,"path":"*rep.CC-Request-Type","tag":"CCRequestType","type":"*variable","value":"~*req.CC-Request-Type"},{"mandatory":true,"path":"*rep.CC-Request-Number","tag":"CCRequestNumber","type":"*variable","value":"~*req.CC-Request-Number"}],"*cdrLog":[{"mandatory":true,"path":"*cdr.ToR","tag":"ToR","type":"*variable","value":"~*req.BalanceType"},{"mandatory":true,"path":"*cdr.OriginHost","tag":"OriginHost","type":"*constant","value":"127.0.0.1"},{"mandatory":true,"path":"*cdr.RequestType","tag":"RequestType","type":"*constant","value":"*none"},{"mandatory":true,"path":"*cdr.Tenant","tag":"Tenant","type":"*variable","value":"~*req.Tenant"},{"mandatory":true,"path":"*cdr.Account","tag":"Account","type":"*variable","value":"~*req.Account"},{"mandatory":true,"path":"*cdr.Subject","tag":"Subject","type":"*variable","value":"~*req.Account"},{"mandatory":true,"path":"*cdr.Cost","tag":"Cost","type":"*variable","value":"~*req.Cost"},{"mandatory":true,"path":"*cdr.Source","tag":"Source","type":"*constant","value":"*cdrLog"},{"mandatory":true,"path":"*cdr.Usage","tag":"Usage","type":"*constant","value":"1"},{"mandatory":true,"path":"*cdr.RunID","tag":"RunID","type":"*variable","value":"~*req.ActionType"},{"mandatory":true,"path":"*cdr.SetupTime","tag":"SetupTime","type":"*constant","value":"*now"},{"mandatory":true,"path":"*cdr.AnswerTime","tag":"AnswerTime","type":"*constant","value":"*now"},{"mandatory":true,"path":"*cdr.PreRated","tag":"PreRated","type":"*constant","value":"true"}],"*err":[{"mandatory":true,"path":"*rep.Session-Id","tag":"SessionId","type":"*variable","value":"~*req.Session-Id"},{"mandatory":true,"path":"*rep.Origin-Host","tag":"OriginHost","type":"*variable","value":"~*vars.OriginHost"},{"mandatory":true,"path":"*rep.Origin-Realm","tag":"OriginRealm","type":"*variable","value":"~*vars.OriginRealm"}],"*errSip":[{"mandatory":true,"path":"*rep.Request","tag":"Request","type":"*constant","value":"SIP/2.0 500 Internal Server Error"}],"*rar":[{"mandatory":true,"path":"*diamreq.Session-Id","tag":"SessionId","type":"*variable","value":"~*req.Session-Id"},{"mandatory":true,"path":"*diamreq.Origin-Host","tag":"OriginHost","type":"*variable","value":"~*req.Destination-Host"},{"mandatory":true,"path":"*diamreq.Origin-Realm","tag":"OriginRealm","type":"*variable","value":"~*req.Destination-Realm"},{"mandatory":true,"path":"*diamreq.Destination-Realm","tag":"DestinationRealm","type":"*variable","value":"~*req.Origin-Realm"},{"mandatory":true,"path":"*diamreq.Destination-Host","tag":"DestinationHost","type":"*variable","value":"~*req.Origin-Host"},{"mandatory":true,"path":"*diamreq.Auth-Application-Id","tag":"AuthApplicationId","type":"*variable","value":"~*vars.*appid"},{"path":"*diamreq.Re-Auth-Request-Type","tag":"ReAuthRequestType","type":"*constant","value":"0"}]},"thresholds":{"enabled":false,"indexed_selects":true,"nested_fields":false,"opts":{"*profileIDs":[],"*profileIgnoreFilters":false},"prefix_indexed_fields":[],"store_interval":"","suffix_indexed_fields":[]},"tls":{"ca_certificate":"","client_certificate":"","client_key":"","server_certificate":"","server_key":"","server_name":"","server_policy":4}}` if err != nil { t.Fatal(err) } diff --git a/config/libconfig_json.go b/config/libconfig_json.go index 0defc15c8..9101c6876 100644 --- a/config/libconfig_json.go +++ b/config/libconfig_json.go @@ -486,6 +486,15 @@ type ThresholdSJsonCfg struct { Opts *ThresholdsOptsJson } +type RoutesOptsJson struct { + Context *string `json:"*context"` + IgnoreErrors *bool `json:"*ignoreErrors"` + MaxCost interface{} `json:"*maxCost"` + Limit *int `json:"*limit"` + Offset *int `json:"*offset"` + ProfileCount *int `json:"*profileCount"` +} + // Route service config section type RouteSJsonCfg struct { Enabled *bool @@ -499,6 +508,7 @@ type RouteSJsonCfg struct { Stats_conns *[]string Rals_conns *[]string Default_ratio *int + Opts *RoutesOptsJson } type LoaderJsonDataType struct { diff --git a/config/routescfg.go b/config/routescfg.go index 193263912..f0f289517 100644 --- a/config/routescfg.go +++ b/config/routescfg.go @@ -22,6 +22,15 @@ import ( "github.com/cgrates/cgrates/utils" ) +type RoutesOpts struct { + Context string + IgnoreErrors bool + MaxCost interface{} + Limit *int + Offset *int + ProfileCount int +} + // RouteSCfg is the configuration of route service type RouteSCfg struct { Enabled bool @@ -35,6 +44,31 @@ type RouteSCfg struct { RALsConns []string DefaultRatio int NestedFields bool + Opts *RoutesOpts +} + +func (rtsOpts *RoutesOpts) loadFromJSONCfg(jsnCfg *RoutesOptsJson) { + if jsnCfg == nil { + return + } + if jsnCfg.Context != nil { + rtsOpts.Context = *jsnCfg.Context + } + if jsnCfg.IgnoreErrors != nil { + rtsOpts.IgnoreErrors = *jsnCfg.IgnoreErrors + } + if jsnCfg.MaxCost != nil { + rtsOpts.MaxCost = jsnCfg.MaxCost + } + if jsnCfg.Limit != nil { + rtsOpts.Limit = jsnCfg.Limit + } + if jsnCfg.Offset != nil { + rtsOpts.Offset = jsnCfg.Offset + } + if jsnCfg.ProfileCount != nil { + rtsOpts.ProfileCount = *jsnCfg.ProfileCount + } } func (rts *RouteSCfg) loadFromJSONCfg(jsnCfg *RouteSJsonCfg) (err error) { @@ -114,16 +148,34 @@ func (rts *RouteSCfg) loadFromJSONCfg(jsnCfg *RouteSJsonCfg) (err error) { if jsnCfg.Nested_fields != nil { rts.NestedFields = *jsnCfg.Nested_fields } + if jsnCfg.Opts != nil { + rts.Opts.loadFromJSONCfg(jsnCfg.Opts) + } return nil } // AsMapInterface returns the config as a map[string]interface{} func (rts *RouteSCfg) AsMapInterface() (initialMP map[string]interface{}) { + opts := map[string]interface{}{ + utils.OptsContext: rts.Opts.Context, + utils.MetaProfileCountCfg: rts.Opts.ProfileCount, + utils.MetaIgnoreErrorsCfg: rts.Opts.IgnoreErrors, + } + if rts.Opts.MaxCost != nil { + opts[utils.MetaMaxCostCfg] = rts.Opts.MaxCost + } + if rts.Opts.Limit != nil { + opts[utils.MetaLimitCfg] = *rts.Opts.Limit + } + if rts.Opts.Offset != nil { + opts[utils.MetaOffsetCfg] = *rts.Opts.Offset + } initialMP = map[string]interface{}{ utils.EnabledCfg: rts.Enabled, utils.IndexedSelectsCfg: rts.IndexedSelects, utils.DefaultRatioCfg: rts.DefaultRatio, utils.NestedFieldsCfg: rts.NestedFields, + utils.OptsCfg: opts, } if rts.StringIndexedFields != nil { stringIndexedFields := make([]string, len(*rts.StringIndexedFields)) @@ -189,6 +241,22 @@ func (rts *RouteSCfg) AsMapInterface() (initialMP map[string]interface{}) { return } +func (rts *RoutesOpts) Clone() (cln *RoutesOpts) { + cln = &RoutesOpts{ + Context: rts.Context, + IgnoreErrors: rts.IgnoreErrors, + ProfileCount: rts.ProfileCount, + MaxCost: rts.MaxCost, + } + if rts.Limit != nil { + cln.Limit = utils.IntPointer(*rts.Limit) + } + if rts.Offset != nil { + cln.Offset = utils.IntPointer(*rts.Offset) + } + return +} + // Clone returns a deep copy of RouteSCfg func (rts RouteSCfg) Clone() (cln *RouteSCfg) { cln = &RouteSCfg{ @@ -196,6 +264,7 @@ func (rts RouteSCfg) Clone() (cln *RouteSCfg) { IndexedSelects: rts.IndexedSelects, DefaultRatio: rts.DefaultRatio, NestedFields: rts.NestedFields, + Opts: rts.Opts.Clone(), } if rts.AttributeSConns != nil { cln.AttributeSConns = make([]string, len(rts.AttributeSConns)) diff --git a/config/routescfg_test.go b/config/routescfg_test.go index 68072baed..f045000bd 100644 --- a/config/routescfg_test.go +++ b/config/routescfg_test.go @@ -50,6 +50,12 @@ func TestRouteSCfgloadFromJsonCfg(t *testing.T) { RALsConns: []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaResponder), "conn1"}, DefaultRatio: 10, NestedFields: true, + Opts: &RoutesOpts{ + Context: utils.MetaRoutes, + IgnoreErrors: false, + MaxCost: utils.EmptyString, + ProfileCount: 1, + }, } jsonCfg := NewDefaultCGRConfig() if err = jsonCfg.routeSCfg.loadFromJSONCfg(cfgJSON); err != nil { @@ -74,6 +80,12 @@ func TestRouteSCfgAsMapInterface(t *testing.T) { utils.StatSConnsCfg: []string{}, utils.RALsConnsCfg: []string{}, utils.DefaultRatioCfg: 1, + utils.OptsCfg: map[string]interface{}{ + utils.OptsContext: utils.MetaRoutes, + utils.MetaProfileCountCfg: 1, + utils.MetaIgnoreErrorsCfg: false, + utils.MetaMaxCostCfg: utils.EmptyString, + }, } if cgrCfg, err := NewCGRConfigFromJSONStringWithDefaults(cfgJSONStr); err != nil { t.Error(err) @@ -110,6 +122,12 @@ func TestRouteSCfgAsMapInterface1(t *testing.T) { utils.StatSConnsCfg: []string{utils.MetaInternal, "conn1"}, utils.RALsConnsCfg: []string{utils.MetaInternal, "conn1"}, utils.DefaultRatioCfg: 2, + utils.OptsCfg: map[string]interface{}{ + utils.OptsContext: utils.MetaRoutes, + utils.MetaProfileCountCfg: 1, + utils.MetaIgnoreErrorsCfg: false, + utils.MetaMaxCostCfg: utils.EmptyString, + }, } if cgrCfg, err := NewCGRConfigFromJSONStringWithDefaults(cfgJSONStr); err != nil { t.Error(err) @@ -131,6 +149,7 @@ func TestRouteSCfgClone(t *testing.T) { RALsConns: []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaResponder), "conn1"}, DefaultRatio: 10, NestedFields: true, + Opts: &RoutesOpts{}, } rcv := ban.Clone() if !reflect.DeepEqual(ban, rcv) { diff --git a/console/routes.go b/console/routes.go index 67a8465cb..03d6dac68 100644 --- a/console/routes.go +++ b/console/routes.go @@ -29,7 +29,7 @@ func init() { c := &CmdRoutesSort{ name: "routes", rpcMethod: utils.RouteSv1GetRoutes, - rpcParams: &engine.ArgsGetRoutes{}, + rpcParams: &utils.CGREvent{}, } commands[c.Name()] = c c.CommandExecuter = &CommandExecuter{c} @@ -38,7 +38,7 @@ func init() { type CmdRoutesSort struct { name string rpcMethod string - rpcParams *engine.ArgsGetRoutes + rpcParams *utils.CGREvent *CommandExecuter } @@ -52,17 +52,14 @@ func (self *CmdRoutesSort) RpcMethod() string { func (self *CmdRoutesSort) RpcParams(reset bool) interface{} { if reset || self.rpcParams == nil { - self.rpcParams = &engine.ArgsGetRoutes{ - CGREvent: new(utils.CGREvent), - } + self.rpcParams = new(utils.CGREvent) } return self.rpcParams } func (self *CmdRoutesSort) PostprocessRpcParams() error { - if self.rpcParams != nil && self.rpcParams.CGREvent != nil && - self.rpcParams.CGREvent.Time == nil { - self.rpcParams.CGREvent.Time = utils.TimePointer(time.Now()) + if self.rpcParams != nil && self.rpcParams.Time == nil { + self.rpcParams.Time = utils.TimePointer(time.Now()) } return nil } diff --git a/dispatchers/routes.go b/dispatchers/routes.go index f3caade9a..d11187a0c 100644 --- a/dispatchers/routes.go +++ b/dispatchers/routes.go @@ -38,28 +38,28 @@ func (dS *DispatcherService) RouteSv1Ping(args *utils.CGREvent, reply *string) ( return dS.Dispatch(args, utils.MetaRoutes, utils.RouteSv1Ping, args, reply) } -func (dS *DispatcherService) RouteSv1GetRoutes(args *engine.ArgsGetRoutes, reply *engine.SortedRoutesList) (err error) { - args.CGREvent.Tenant = utils.FirstNonEmpty(args.CGREvent.Tenant, dS.cfg.GeneralCfg().DefaultTenant) +func (dS *DispatcherService) RouteSv1GetRoutes(args *utils.CGREvent, reply *engine.SortedRoutesList) (err error) { + args.Tenant = utils.FirstNonEmpty(args.Tenant, dS.cfg.GeneralCfg().DefaultTenant) if len(dS.cfg.DispatcherSCfg().AttributeSConns) != 0 { if err = dS.authorize(utils.RouteSv1GetRoutes, - args.CGREvent.Tenant, - utils.IfaceAsString(args.APIOpts[utils.OptsAPIKey]), args.CGREvent.Time); err != nil { + args.Tenant, + utils.IfaceAsString(args.APIOpts[utils.OptsAPIKey]), args.Time); err != nil { return } } - return dS.Dispatch(args.CGREvent, utils.MetaRoutes, utils.RouteSv1GetRoutes, args, reply) + return dS.Dispatch(args, utils.MetaRoutes, utils.RouteSv1GetRoutes, args, reply) } -func (dS *DispatcherService) RouteSv1GetRoutesList(args *engine.ArgsGetRoutes, reply *[]string) (err error) { - args.CGREvent.Tenant = utils.FirstNonEmpty(args.CGREvent.Tenant, dS.cfg.GeneralCfg().DefaultTenant) +func (dS *DispatcherService) RouteSv1GetRoutesList(args *utils.CGREvent, reply *[]string) (err error) { + args.Tenant = utils.FirstNonEmpty(args.Tenant, dS.cfg.GeneralCfg().DefaultTenant) if len(dS.cfg.DispatcherSCfg().AttributeSConns) != 0 { if err = dS.authorize(utils.RouteSv1GetRoutesList, - args.CGREvent.Tenant, - utils.IfaceAsString(args.APIOpts[utils.OptsAPIKey]), args.CGREvent.Time); err != nil { + args.Tenant, + utils.IfaceAsString(args.APIOpts[utils.OptsAPIKey]), args.Time); err != nil { return } } - return dS.Dispatch(args.CGREvent, utils.MetaRoutes, utils.RouteSv1GetRoutesList, args, reply) + return dS.Dispatch(args, utils.MetaRoutes, utils.RouteSv1GetRoutesList, args, reply) } func (dS *DispatcherService) RouteSv1GetRouteProfilesForEvent(args *utils.CGREvent, reply *[]*engine.RouteProfile) (err error) { diff --git a/dispatchers/routes_it_test.go b/dispatchers/routes_it_test.go index de0ba01e8..f73ea70cb 100644 --- a/dispatchers/routes_it_test.go +++ b/dispatchers/routes_it_test.go @@ -163,23 +163,21 @@ func testDspSupGetSupFailover(t *testing.T) { }, }, }} - args := &engine.ArgsGetRoutes{ - CGREvent: &utils.CGREvent{ - Tenant: "cgrates.org", - ID: utils.UUIDSha1Prefix(), - Time: &nowTime, - Event: map[string]interface{}{ - utils.EventName: "Event1", - utils.AccountField: "1002", - utils.Subject: "1002", - utils.Destination: "1001", - utils.SetupTime: time.Date(2017, 12, 1, 14, 25, 0, 0, time.UTC), - utils.Usage: "1m20s", - }, + args := &utils.CGREvent{ + Tenant: "cgrates.org", + ID: utils.UUIDSha1Prefix(), + Time: &nowTime, + Event: map[string]interface{}{ + utils.EventName: "Event1", + utils.AccountField: "1002", + utils.Subject: "1002", + utils.Destination: "1001", + utils.SetupTime: time.Date(2017, 12, 1, 14, 25, 0, 0, time.UTC), + utils.Usage: "1m20s", + }, - APIOpts: map[string]interface{}{ - utils.OptsAPIKey: "sup12345", - }, + APIOpts: map[string]interface{}{ + utils.OptsAPIKey: "sup12345", }, } if err := dispEngine.RPC.Call(utils.RouteSv1GetRoutes, @@ -200,21 +198,19 @@ func testDspSupGetSupFailover(t *testing.T) { func testDspSupTestAuthKey(t *testing.T) { var rpl engine.SortedRoutesList - args := &engine.ArgsGetRoutes{ - CGREvent: &utils.CGREvent{ - ID: utils.UUIDSha1Prefix(), - Time: &nowTime, - Event: map[string]interface{}{ - utils.AccountField: "1002", - utils.Subject: "1002", - utils.Destination: "1001", - utils.SetupTime: time.Date(2017, 12, 1, 14, 25, 0, 0, time.UTC), - utils.Usage: "1m20s", - }, + args := &utils.CGREvent{ + ID: utils.UUIDSha1Prefix(), + Time: &nowTime, + Event: map[string]interface{}{ + utils.AccountField: "1002", + utils.Subject: "1002", + utils.Destination: "1001", + utils.SetupTime: time.Date(2017, 12, 1, 14, 25, 0, 0, time.UTC), + utils.Usage: "1m20s", + }, - APIOpts: map[string]interface{}{ - utils.OptsAPIKey: "12345", - }, + APIOpts: map[string]interface{}{ + utils.OptsAPIKey: "12345", }, } if err := dispEngine.RPC.Call(utils.RouteSv1GetRoutes, @@ -249,22 +245,20 @@ func testDspSupTestAuthKey2(t *testing.T) { }, }, }} - args := &engine.ArgsGetRoutes{ - CGREvent: &utils.CGREvent{ - Tenant: "cgrates.org", - ID: utils.UUIDSha1Prefix(), - Time: &nowTime, - Event: map[string]interface{}{ - utils.AccountField: "1002", - utils.Subject: "1002", - utils.Destination: "1001", - utils.SetupTime: time.Date(2017, 12, 1, 14, 25, 0, 0, time.UTC), - utils.Usage: "1m20s", - }, + args := &utils.CGREvent{ + Tenant: "cgrates.org", + ID: utils.UUIDSha1Prefix(), + Time: &nowTime, + Event: map[string]interface{}{ + utils.AccountField: "1002", + utils.Subject: "1002", + utils.Destination: "1001", + utils.SetupTime: time.Date(2017, 12, 1, 14, 25, 0, 0, time.UTC), + utils.Usage: "1m20s", + }, - APIOpts: map[string]interface{}{ - utils.OptsAPIKey: "sup12345", - }, + APIOpts: map[string]interface{}{ + utils.OptsAPIKey: "sup12345", }, } if err := dispEngine.RPC.Call(utils.RouteSv1GetRoutes, @@ -314,23 +308,21 @@ func testDspSupGetSupRoundRobin(t *testing.T) { }, }, }} - args := &engine.ArgsGetRoutes{ - CGREvent: &utils.CGREvent{ - Tenant: "cgrates.org", - ID: utils.UUIDSha1Prefix(), - Time: &nowTime, - Event: map[string]interface{}{ - utils.EventName: "RoundRobin", - utils.AccountField: "1002", - utils.Subject: "1002", - utils.Destination: "1001", - utils.SetupTime: time.Date(2017, 12, 1, 14, 25, 0, 0, time.UTC), - utils.Usage: "1m20s", - }, + args := &utils.CGREvent{ + Tenant: "cgrates.org", + ID: utils.UUIDSha1Prefix(), + Time: &nowTime, + Event: map[string]interface{}{ + utils.EventName: "RoundRobin", + utils.AccountField: "1002", + utils.Subject: "1002", + utils.Destination: "1001", + utils.SetupTime: time.Date(2017, 12, 1, 14, 25, 0, 0, time.UTC), + utils.Usage: "1m20s", + }, - APIOpts: map[string]interface{}{ - utils.OptsAPIKey: "sup12345", - }, + APIOpts: map[string]interface{}{ + utils.OptsAPIKey: "sup12345", }, } if err := dispEngine.RPC.Call(utils.RouteSv1GetRoutes, diff --git a/dispatchers/routes_test.go b/dispatchers/routes_test.go index 967a2085a..1aa2e566a 100644 --- a/dispatchers/routes_test.go +++ b/dispatchers/routes_test.go @@ -71,10 +71,8 @@ func TestDspRouteSv1GetRoutesNil(t *testing.T) { cgrCfg := config.NewDefaultCGRConfig() dspSrv := NewDispatcherService(nil, cgrCfg, nil, nil) cgrCfg.DispatcherSCfg().AttributeSConns = []string{"test"} - CGREvent := &engine.ArgsGetRoutes{ - CGREvent: &utils.CGREvent{ - Tenant: "tenant", - }, + CGREvent := &utils.CGREvent{ + Tenant: "tenant", } var reply *engine.SortedRoutesList result := dspSrv.RouteSv1GetRoutes(CGREvent, reply) @@ -87,10 +85,8 @@ func TestDspRouteSv1GetRoutesNil(t *testing.T) { func TestDspRouteSv1GetRoutesErrorNil(t *testing.T) { cgrCfg := config.NewDefaultCGRConfig() dspSrv := NewDispatcherService(nil, cgrCfg, nil, nil) - CGREvent := &engine.ArgsGetRoutes{ - CGREvent: &utils.CGREvent{ - Tenant: "tenant", - }, + CGREvent := &utils.CGREvent{ + Tenant: "tenant", } var reply *engine.SortedRoutesList result := dspSrv.RouteSv1GetRoutes(CGREvent, reply) @@ -104,10 +100,8 @@ func TestDspRouteSv1GetRoutesListNil(t *testing.T) { cgrCfg := config.NewDefaultCGRConfig() dspSrv := NewDispatcherService(nil, cgrCfg, nil, nil) cgrCfg.DispatcherSCfg().AttributeSConns = []string{"test"} - CGREvent := &engine.ArgsGetRoutes{ - CGREvent: &utils.CGREvent{ - Tenant: "tenant", - }, + CGREvent := &utils.CGREvent{ + Tenant: "tenant", } var reply *[]string result := dspSrv.RouteSv1GetRoutesList(CGREvent, reply) @@ -120,10 +114,8 @@ func TestDspRouteSv1GetRoutesListNil(t *testing.T) { func TestDspRouteSv1GetRoutesListErrorNil(t *testing.T) { cgrCfg := config.NewDefaultCGRConfig() dspSrv := NewDispatcherService(nil, cgrCfg, nil, nil) - CGREvent := &engine.ArgsGetRoutes{ - CGREvent: &utils.CGREvent{ - Tenant: "tenant", - }, + CGREvent := &utils.CGREvent{ + Tenant: "tenant", } var reply *[]string result := dspSrv.RouteSv1GetRoutesList(CGREvent, reply) diff --git a/dispatchers/sessions_it_test.go b/dispatchers/sessions_it_test.go index 929398c5b..b03008cad 100644 --- a/dispatchers/sessions_it_test.go +++ b/dispatchers/sessions_it_test.go @@ -243,8 +243,8 @@ func testDspSessionAuthorize(t *testing.T) { }, APIOpts: map[string]interface{}{ - utils.OptsAPIKey: "ses12345", - utils.OptsRoutesProfilesCount: 1., + utils.OptsAPIKey: "ses12345", + utils.OptsRoutesProfileCount: 1., }, }, } diff --git a/engine/routes.go b/engine/routes.go index 5e26a4966..e8932ffd0 100644 --- a/engine/routes.go +++ b/engine/routes.go @@ -499,47 +499,52 @@ func (rpS *RouteService) populateSortingData(ev *utils.CGREvent, route *Route, return sortedSpl, true, nil } -// ArgsGetRoutes the argument for GetRoutes API -type ArgsGetRoutes struct { - IgnoreErrors bool - MaxCost string // toDo: try with interface{} here - *utils.CGREvent - utils.Paginator - clnb bool //rpcclonable -} - -// SetCloneable sets if the args should be clonned on internal connections -func (attr *ArgsGetRoutes) SetCloneable(rpcCloneable bool) { - attr.clnb = rpcCloneable -} - -// RPCClone implements rpcclient.RPCCloner interface -func (attr *ArgsGetRoutes) RPCClone() (interface{}, error) { - if !attr.clnb { - return attr, nil +func newOptsGetRoutes(ev *utils.CGREvent, fS *FilterS, cfgOpts *config.RoutesOpts) (opts *optsGetRoutes, err error) { + ignoreErrors := cfgOpts.IgnoreErrors + if opt, has := ev.APIOpts[utils.OptsRoutesIgnoreErrors]; has { + if ignoreErrors, err = utils.IfaceAsBool(opt); err != nil { + return + } } - return attr.Clone(), nil -} - -// Clone creates a clone of the object -func (attr *ArgsGetRoutes) Clone() *ArgsGetRoutes { - return &ArgsGetRoutes{ - IgnoreErrors: attr.IgnoreErrors, - MaxCost: attr.MaxCost, - Paginator: attr.Paginator.Clone(), - CGREvent: attr.CGREvent.Clone(), + opts = &optsGetRoutes{ + ignoreErrors: ignoreErrors, + paginator: &utils.Paginator{}, + } + limit := cfgOpts.Limit + if opt, has := ev.APIOpts[utils.OptsRoutesLimit]; has { + var value int64 + if value, err = utils.IfaceAsTInt64(opt); err != nil { + return + } + limit = utils.IntPointer(int(value)) + } + if limit != nil { + opts.paginator.Limit = limit + } + offset := cfgOpts.Offset + if opt, has := ev.APIOpts[utils.OptsRoutesOffset]; has { + var value int64 + if value, err = utils.IfaceAsTInt64(opt); err != nil { + return + } + offset = utils.IntPointer(int(value)) + } + if offset != nil { + opts.paginator.Offset = offset + } + maxCost := cfgOpts.MaxCost + if opt, has := ev.APIOpts[utils.OptsRoutesMaxCost]; has { + maxCost = opt } -} -func (attr *ArgsGetRoutes) asOptsGetRoutes() (opts *optsGetRoutes, err error) { - opts = &optsGetRoutes{ignoreErrors: attr.IgnoreErrors} - if attr.MaxCost == utils.MetaEventCost { // dynamic cost needs to be calculated from event - if err = attr.CGREvent.CheckMandatoryFields([]string{utils.AccountField, + switch maxCost { + case utils.EmptyString, nil: + case utils.MetaEventCost: // dynamic cost needs to be calculated from event + if err = ev.CheckMandatoryFields([]string{utils.AccountField, utils.Destination, utils.SetupTime, utils.Usage}); err != nil { return } - cd, err := NewCallDescriptorFromCGREvent(attr.CGREvent, - config.CgrConfig().GeneralCfg().DefaultTimezone) + cd, err := NewCallDescriptorFromCGREvent(ev, config.CgrConfig().GeneralCfg().DefaultTimezone) if err != nil { return nil, err } @@ -548,9 +553,8 @@ func (attr *ArgsGetRoutes) asOptsGetRoutes() (opts *optsGetRoutes, err error) { return nil, err } opts.maxCost = cc.Cost - } else if attr.MaxCost != "" { - if opts.maxCost, err = strconv.ParseFloat(attr.MaxCost, - 64); err != nil { + default: + if opts.maxCost, err = utils.IfaceAsFloat64(maxCost); err != nil { return nil, err } } @@ -560,18 +564,19 @@ func (attr *ArgsGetRoutes) asOptsGetRoutes() (opts *optsGetRoutes, err error) { type optsGetRoutes struct { ignoreErrors bool maxCost float64 + paginator *utils.Paginator sortingParameters []string //used for QOS strategy sortingStragety string } // V1GetRoutes returns the list of valid routes -func (rpS *RouteService) V1GetRoutes(args *ArgsGetRoutes, reply *SortedRoutesList) (err error) { - if args.CGREvent == nil { +func (rpS *RouteService) V1GetRoutes(args *utils.CGREvent, reply *SortedRoutesList) (err error) { + if args == nil { return utils.NewErrMandatoryIeMissing(utils.CGREventString) } - if missing := utils.MissingStructFields(args.CGREvent, []string{utils.ID}); len(missing) != 0 { + if missing := utils.MissingStructFields(args, []string{utils.ID}); len(missing) != 0 { return utils.NewErrMandatoryIeMissing(missing...) - } else if args.CGREvent.Event == nil { + } else if args.Event == nil { return utils.NewErrMandatoryIeMissing(utils.Event) } tnt := args.Tenant @@ -583,14 +588,13 @@ func (rpS *RouteService) V1GetRoutes(args *ArgsGetRoutes, reply *SortedRoutesLis args.APIOpts = make(map[string]interface{}) } args.APIOpts[utils.Subsys] = utils.MetaRoutes - if args.CGREvent.APIOpts[utils.OptsContext] == utils.EmptyString { - args.CGREvent.APIOpts[utils.OptsContext] = utils.MetaRoutes + if args.APIOpts[utils.OptsContext] == utils.EmptyString { + args.APIOpts[utils.OptsContext] = utils.MetaRoutes } var rplyEv AttrSProcessEventReply if err := rpS.connMgr.Call(rpS.cgrcfg.RouteSCfg().AttributeSConns, nil, - utils.AttributeSv1ProcessEvent, args.CGREvent, &rplyEv); err == nil && len(rplyEv.AlteredFields) != 0 { - args.CGREvent = rplyEv.CGREvent - args.APIOpts = rplyEv.APIOpts + utils.AttributeSv1ProcessEvent, args, &rplyEv); err == nil && len(rplyEv.AlteredFields) != 0 { + args = rplyEv.CGREvent } else if err.Error() != utils.ErrNotFound.Error() { return utils.NewErrRouteS(err) } @@ -679,41 +683,45 @@ func (rpS *RouteService) sortedRoutesForProfile(tnt string, rPrfl *RouteProfile, // sortedRoutesForEvent will return the list of valid route IDs // for event based on filters and sorting algorithms -func (rpS *RouteService) sortedRoutesForEvent(tnt string, args *ArgsGetRoutes) (sortedRoutes SortedRoutesList, err error) { - if _, has := args.CGREvent.Event[utils.Usage]; !has { - args.CGREvent.Event[utils.Usage] = time.Minute // make sure we have default set for Usage +func (rpS *RouteService) sortedRoutesForEvent(tnt string, args *utils.CGREvent) (sortedRoutes SortedRoutesList, err error) { + if _, has := args.Event[utils.Usage]; !has { + args.Event[utils.Usage] = time.Minute // make sure we have default set for Usage } var rPrfs []*RouteProfile - if rPrfs, err = rpS.matchingRouteProfilesForEvent(tnt, args.CGREvent); err != nil { + if rPrfs, err = rpS.matchingRouteProfilesForEvent(tnt, args); err != nil { return } prfCount := len(rPrfs) // if the option is not present return for all profiles - if prfCountOpt, err := args.OptAsInt64(utils.OptsRoutesProfilesCount); err != nil { - if err != utils.ErrNotFound { // is an conversion error - return nil, err + prfCountOpt := rpS.cgrcfg.RouteSCfg().Opts.ProfileCount + if opt, has := args.APIOpts[utils.OptsRoutesProfileCount]; has { + var value int64 + if value, err = utils.IfaceAsTInt64(opt); err != nil { + return } - } else if prfCount > int(prfCountOpt) { // it has the option and is smaller that the current number of profiles - prfCount = int(prfCountOpt) + prfCountOpt = int(value) + } + if prfCount > prfCountOpt { // it has the option and is smaller that the current number of profiles + prfCount = prfCountOpt } var extraOpts *optsGetRoutes - if extraOpts, err = args.asOptsGetRoutes(); err != nil { // convert routes arguments into internal options used to limit data + if extraOpts, err = newOptsGetRoutes(args, rpS.filterS, rpS.cgrcfg.RouteSCfg().Opts); err != nil { // convert routes arguments into internal options used to limit data return } var startIdx, noSrtRoutes int - if args.Paginator.Offset != nil { // save the offset in a variable to not double check if we have offset and is still not 0 - startIdx = *args.Paginator.Offset + if extraOpts.paginator.Offset != nil { // save the offset in a variable to not double check if we have offset and is still not 0 + startIdx = *extraOpts.paginator.Offset } sortedRoutes = make(SortedRoutesList, 0, prfCount) for _, rPrfl := range rPrfs { var prfPag utils.Paginator - if args.Paginator.Limit != nil { // we have a limit - if noSrtRoutes >= *args.Paginator.Limit { // the limit was reached + if extraOpts.paginator.Limit != nil { // we have a limit + if noSrtRoutes >= *extraOpts.paginator.Limit { // the limit was reached break } - if noSrtRoutes+len(rPrfl.Routes) > *args.Paginator.Limit { // the limit will be reached in this profile - limit := *args.Paginator.Limit - noSrtRoutes // make it relative to current profile - prfPag.Limit = &limit // add the limit to the paginator + if noSrtRoutes+len(rPrfl.Routes) > *extraOpts.paginator.Limit { // the limit will be reached in this profile + limit := *extraOpts.paginator.Limit - noSrtRoutes // make it relative to current profile + prfPag.Limit = &limit // add the limit to the paginator } } if startIdx > 0 { // we have offset @@ -727,7 +735,7 @@ func (rpS *RouteService) sortedRoutesForEvent(tnt string, args *ArgsGetRoutes) ( prfPag.Offset = &offset } var sr *SortedRoutes - if sr, err = rpS.sortedRoutesForProfile(tnt, rPrfl, args.CGREvent, prfPag, extraOpts); err != nil { + if sr, err = rpS.sortedRoutesForProfile(tnt, rPrfl, args, prfPag, extraOpts); err != nil { return } if len(sr.Routes) != 0 { @@ -745,7 +753,7 @@ func (rpS *RouteService) sortedRoutesForEvent(tnt string, args *ArgsGetRoutes) ( } // V1GetRoutesList returns the list of valid routes -func (rpS *RouteService) V1GetRoutesList(args *ArgsGetRoutes, reply *[]string) (err error) { +func (rpS *RouteService) V1GetRoutesList(args *utils.CGREvent, reply *[]string) (err error) { sR := new(SortedRoutesList) if err = rpS.V1GetRoutes(args, sR); err != nil { return diff --git a/engine/routes_test.go b/engine/routes_test.go index c6b274922..7d4d9a5e8 100644 --- a/engine/routes_test.go +++ b/engine/routes_test.go @@ -161,51 +161,47 @@ var ( Weight: 10, }, } - testRoutesArgs = []*ArgsGetRoutes{ + testRoutesArgs = []*utils.CGREvent{ { //matching RouteProfile1 - CGREvent: &utils.CGREvent{ - Tenant: "cgrates.org", - ID: "utils.CGREvent1", - Event: map[string]interface{}{ - "Route": "RouteProfile1", - utils.AnswerTime: time.Date(2014, 7, 14, 14, 30, 0, 0, time.UTC), - "UsageInterval": "1s", - "PddInterval": "1s", - utils.Weight: "20.0", - }, + Tenant: "cgrates.org", + ID: "utils.CGREvent1", + Event: map[string]interface{}{ + "Route": "RouteProfile1", + utils.AnswerTime: time.Date(2014, 7, 14, 14, 30, 0, 0, time.UTC), + "UsageInterval": "1s", + "PddInterval": "1s", + utils.Weight: "20.0", }, + APIOpts: map[string]interface{}{}, }, { //matching RouteProfile2 - CGREvent: &utils.CGREvent{ - Tenant: "cgrates.org", - ID: "utils.CGREvent1", - Event: map[string]interface{}{ - "Route": "RouteProfile2", - utils.AnswerTime: time.Date(2014, 7, 14, 14, 30, 0, 0, time.UTC), - "UsageInterval": "1s", - "PddInterval": "1s", - utils.Weight: "20.0", - }, + Tenant: "cgrates.org", + ID: "utils.CGREvent1", + Event: map[string]interface{}{ + "Route": "RouteProfile2", + utils.AnswerTime: time.Date(2014, 7, 14, 14, 30, 0, 0, time.UTC), + "UsageInterval": "1s", + "PddInterval": "1s", + utils.Weight: "20.0", }, + APIOpts: map[string]interface{}{}, }, { //matching RouteProfilePrefix - CGREvent: &utils.CGREvent{ - Tenant: "cgrates.org", - ID: "utils.CGREvent1", - Event: map[string]interface{}{ - "Route": "RouteProfilePrefix", - }, + Tenant: "cgrates.org", + ID: "utils.CGREvent1", + Event: map[string]interface{}{ + "Route": "RouteProfilePrefix", }, + APIOpts: map[string]interface{}{}, }, - { //matching - CGREvent: &utils.CGREvent{ - Tenant: "cgrates.org", - ID: "CGR", - Event: map[string]interface{}{ - "UsageInterval": "1s", - "PddInterval": "1s", - }, + { + Tenant: "cgrates.org", + ID: "CGR", + Event: map[string]interface{}{ + "UsageInterval": "1s", + "PddInterval": "1s", }, + APIOpts: map[string]interface{}{}, }, } ) @@ -306,7 +302,7 @@ func TestRoutesmatchingRouteProfilesForEvent(t *testing.T) { dm: dmSPP, cfg: cfg}, cfg, nil) prepareRoutesData(t, dmSPP) for i, spp := range testRoutesPrfs { - sprf, err := routeService.matchingRouteProfilesForEvent("cgrates.org", testRoutesArgs[i].CGREvent) + sprf, err := routeService.matchingRouteProfilesForEvent("cgrates.org", testRoutesArgs[i]) if err != nil { t.Fatal(err) } @@ -460,12 +456,9 @@ func TestRoutesSortedForEventWithLimit(t *testing.T) { }, }, }} - sprf, err := routeService.sortedRoutesForEvent("cgrates.org", &ArgsGetRoutes{ - CGREvent: testRoutesArgs[1].CGREvent, - Paginator: utils.Paginator{ - Limit: utils.IntPointer(2), - }, - }) + testRoutesArgs[1].APIOpts[utils.OptsRoutesLimit] = 2 + delete(testRoutesArgs[1].APIOpts, utils.OptsRoutesOffset) + sprf, err := routeService.sortedRoutesForEvent("cgrates.org", testRoutesArgs[1]) if err != nil { t.Fatal(err) } @@ -502,12 +495,9 @@ func TestRoutesSortedForEventWithOffset(t *testing.T) { }, }, }} - sprf, err := routeService.sortedRoutesForEvent("cgrates.org", &ArgsGetRoutes{ - CGREvent: testRoutesArgs[1].CGREvent, - Paginator: utils.Paginator{ - Offset: utils.IntPointer(2), - }, - }) + testRoutesArgs[1].APIOpts[utils.OptsRoutesOffset] = 2 + delete(testRoutesArgs[1].APIOpts, utils.OptsRoutesLimit) + sprf, err := routeService.sortedRoutesForEvent("cgrates.org", testRoutesArgs[1]) if err != nil { t.Fatal(err) } @@ -543,13 +533,9 @@ func TestRoutesSortedForEventWithLimitAndOffset(t *testing.T) { }, }, }} - sprf, err := routeService.sortedRoutesForEvent("cgrates.org", &ArgsGetRoutes{ - CGREvent: testRoutesArgs[1].CGREvent, - Paginator: utils.Paginator{ - Limit: utils.IntPointer(1), - Offset: utils.IntPointer(1), - }, - }) + testRoutesArgs[1].APIOpts[utils.OptsRoutesLimit] = 1 + testRoutesArgs[1].APIOpts[utils.OptsRoutesLimit] = 1 + sprf, err := routeService.sortedRoutesForEvent("cgrates.org", testRoutesArgs[1]) if err != nil { t.Fatal(err) } @@ -558,40 +544,6 @@ func TestRoutesSortedForEventWithLimitAndOffset(t *testing.T) { } } -func TestRoutesAsOptsGetRoutes(t *testing.T) { - s := &ArgsGetRoutes{ - IgnoreErrors: true, - MaxCost: "10.0", - } - spl := &optsGetRoutes{ - ignoreErrors: true, - maxCost: 10.0, - } - sprf, err := s.asOptsGetRoutes() - if err != nil { - t.Fatal(err) - } - if !reflect.DeepEqual(spl, sprf) { - t.Errorf("Expecting: %+v,received: %+v", spl, sprf) - } -} - -func TestRoutesAsOptsGetRoutesIgnoreErrors(t *testing.T) { - s := &ArgsGetRoutes{ - IgnoreErrors: true, - } - spl := &optsGetRoutes{ - ignoreErrors: true, - } - sprf, err := s.asOptsGetRoutes() - if err != nil { - t.Fatal(err) - } - if !reflect.DeepEqual(spl, sprf) { - t.Errorf("Expecting: %+v,received: %+v", spl, sprf) - } -} - func TestRoutesAsOptsGetRoutesMaxCost(t *testing.T) { cfg := config.NewDefaultCGRConfig() data := NewInternalDB(nil, nil, true, cfg.DataDbCfg().Items) @@ -604,7 +556,7 @@ func TestRoutesAsOptsGetRoutesMaxCost(t *testing.T) { prepareRoutesData(t, dmSPP) routeService.cgrcfg.RouteSCfg().IndexedSelects = false - sprf, err := routeService.matchingRouteProfilesForEvent("cgrates.org", testRoutesArgs[0].CGREvent) + sprf, err := routeService.matchingRouteProfilesForEvent("cgrates.org", testRoutesArgs[0]) if err != nil { t.Fatal(err) } @@ -612,7 +564,7 @@ func TestRoutesAsOptsGetRoutesMaxCost(t *testing.T) { t.Errorf("Expecting: %+v, received: %+v", testRoutesPrfs[0], sprf[0]) } - sprf, err = routeService.matchingRouteProfilesForEvent("cgrates.org", testRoutesArgs[1].CGREvent) + sprf, err = routeService.matchingRouteProfilesForEvent("cgrates.org", testRoutesArgs[1]) if err != nil { t.Fatal(err) } @@ -620,7 +572,7 @@ func TestRoutesAsOptsGetRoutesMaxCost(t *testing.T) { t.Errorf("Expecting: %+v, received: %+v", testRoutesPrfs[1], sprf[0]) } - sprf, err = routeService.matchingRouteProfilesForEvent("cgrates.org", testRoutesArgs[2].CGREvent) + sprf, err = routeService.matchingRouteProfilesForEvent("cgrates.org", testRoutesArgs[2]) if err != nil { t.Fatal(err) } @@ -640,7 +592,7 @@ func TestRoutesMatchWithIndexFalse(t *testing.T) { prepareRoutesData(t, dmSPP) routeService.cgrcfg.RouteSCfg().IndexedSelects = false - sprf, err := routeService.matchingRouteProfilesForEvent("cgrates.org", testRoutesArgs[0].CGREvent) + sprf, err := routeService.matchingRouteProfilesForEvent("cgrates.org", testRoutesArgs[0]) if err != nil { t.Fatal(err) } @@ -648,7 +600,7 @@ func TestRoutesMatchWithIndexFalse(t *testing.T) { t.Errorf("Expecting: %+v, received: %+v", testRoutesPrfs[0], sprf[0]) } - sprf, err = routeService.matchingRouteProfilesForEvent("cgrates.org", testRoutesArgs[1].CGREvent) + sprf, err = routeService.matchingRouteProfilesForEvent("cgrates.org", testRoutesArgs[1]) if err != nil { t.Fatal(err) } @@ -656,7 +608,7 @@ func TestRoutesMatchWithIndexFalse(t *testing.T) { t.Errorf("Expecting: %+v, received: %+v", testRoutesPrfs[1], sprf[0]) } - sprf, err = routeService.matchingRouteProfilesForEvent("cgrates.org", testRoutesArgs[2].CGREvent) + sprf, err = routeService.matchingRouteProfilesForEvent("cgrates.org", testRoutesArgs[2]) if err != nil { t.Fatal(err) } @@ -731,12 +683,12 @@ func TestRoutesSortedForEventWithLimitAndOffset2(t *testing.T) { Weight: 0, }, } - argsGetRoutes := &ArgsGetRoutes{ - CGREvent: &utils.CGREvent{ - Tenant: "cgrates.org", - ID: "utils.CGREvent1", - Event: map[string]interface{}{}, - APIOpts: map[string]interface{}{utils.OptsRoutesProfilesCount: 3}, + argsGetRoutes := &utils.CGREvent{ + Tenant: "cgrates.org", + ID: "utils.CGREvent1", + Event: map[string]interface{}{}, + APIOpts: map[string]interface{}{ + utils.OptsRoutesProfileCount: 3, }, } @@ -794,10 +746,8 @@ func TestRoutesSortedForEventWithLimitAndOffset2(t *testing.T) { }, }, } - argsGetRoutes.Paginator = utils.Paginator{ - Limit: utils.IntPointer(2), - Offset: utils.IntPointer(1), - } + argsGetRoutes.APIOpts[utils.OptsRoutesLimit] = 2 + argsGetRoutes.APIOpts[utils.OptsRoutesOffset] = 1 sprf, err := routeService.sortedRoutesForEvent(argsGetRoutes.Tenant, argsGetRoutes) if err != nil { t.Fatal(err) diff --git a/general_tests/route_it_test.go b/general_tests/route_it_test.go index b28bf5673..8873f84f2 100644 --- a/general_tests/route_it_test.go +++ b/general_tests/route_it_test.go @@ -162,17 +162,15 @@ func testV1SplSSetRouteProfilesWithoutRatingPlanIDs(t *testing.T) { } else if !reflect.DeepEqual(splPrf.RouteProfile, reply) { t.Errorf("Expecting: %+v, received: %+v", splPrf.RouteProfile, reply) } - ev := &engine.ArgsGetRoutes{ - CGREvent: &utils.CGREvent{ - Tenant: "cgrates.org", - ID: "testV1SplSGetLeastCostSuppliers", - Event: map[string]interface{}{ - utils.AccountField: "accc", - utils.Subject: "1003", - utils.Destination: "1002", - utils.SetupTime: time.Date(2017, 12, 1, 14, 25, 0, 0, time.UTC), - utils.Usage: "1m20s", - }, + ev := &utils.CGREvent{ + Tenant: "cgrates.org", + ID: "testV1SplSGetLeastCostSuppliers", + Event: map[string]interface{}{ + utils.AccountField: "accc", + utils.Subject: "1003", + utils.Destination: "1002", + utils.SetupTime: time.Date(2017, 12, 1, 14, 25, 0, 0, time.UTC), + utils.Usage: "1m20s", }, } var suplsReply engine.SortedRoutesList @@ -432,13 +430,11 @@ func testV1SplSPopulateResUsage(t *testing.T) { } func testV1SplSGetSortedRoutes(t *testing.T) { - ev := &engine.ArgsGetRoutes{ - CGREvent: &utils.CGREvent{ - Tenant: "cgrates.org", - ID: "testV1SplSGetSortedRoutes", - Event: map[string]interface{}{ - "CustomField": "ResourceTest", - }, + ev := &utils.CGREvent{ + Tenant: "cgrates.org", + ID: "testV1SplSGetSortedRoutes", + Event: map[string]interface{}{ + "CustomField": "ResourceTest", }, } expSupplierIDs := []string{"route3", "route2", "route1"} @@ -516,13 +512,11 @@ func testV1SplSAddNewRoutePrf2(t *testing.T) { } func testV1SplSGetSortedRoutes2(t *testing.T) { - ev := &engine.ArgsGetRoutes{ - CGREvent: &utils.CGREvent{ - Tenant: "cgrates.org", - ID: "testV1SplSGetSortedSuppliers2", - Event: map[string]interface{}{ - "CustomField": "ResourceDescendent", - }, + ev := &utils.CGREvent{ + Tenant: "cgrates.org", + ID: "testV1SplSGetSortedSuppliers2", + Event: map[string]interface{}{ + "CustomField": "ResourceDescendent", }, } expSupplierIDs := []string{"route1", "route3", "route2"} @@ -689,13 +683,11 @@ func testV1SplSPopulateStats(t *testing.T) { } func testV1SplSGetSoredRoutesWithLoad(t *testing.T) { - ev := &engine.ArgsGetRoutes{ - CGREvent: &utils.CGREvent{ - Tenant: "cgrates.org", - ID: "testV1SplSGetSoredSuppliersWithLoad", - Event: map[string]interface{}{ - "DistinctMatch": "LoadDistStrategy", - }, + ev := &utils.CGREvent{ + Tenant: "cgrates.org", + ID: "testV1SplSGetSoredSuppliersWithLoad", + Event: map[string]interface{}{ + "DistinctMatch": "LoadDistStrategy", }, } diff --git a/general_tests/routes_cases_it_test.go b/general_tests/routes_cases_it_test.go index 17bdbe921..a18c8f463 100644 --- a/general_tests/routes_cases_it_test.go +++ b/general_tests/routes_cases_it_test.go @@ -394,13 +394,11 @@ func testV1RtsCaseGetRoutesAfterLoading(t *testing.T) { } func testV1RtsCasesSortingRoutesWeightAccountValue(t *testing.T) { - ev := &engine.ArgsGetRoutes{ - CGREvent: &utils.CGREvent{ - ID: "WEIGHT_SORT", - Tenant: "cgrates.org", - Event: map[string]interface{}{ - utils.AccountField: "1001", - }, + ev := &utils.CGREvent{ + ID: "WEIGHT_SORT", + Tenant: "cgrates.org", + Event: map[string]interface{}{ + utils.AccountField: "1001", }, } expSrtdRoutes := &engine.SortedRoutesList{ @@ -433,14 +431,12 @@ func testV1RtsCasesSortingRoutesWeightAccountValue(t *testing.T) { } func testV1RtsCasesSortingRoutesWeightAllRoutes(t *testing.T) { - ev := &engine.ArgsGetRoutes{ - CGREvent: &utils.CGREvent{ - ID: "WEIGHT_SORT", - Tenant: "cgrates.org", - Event: map[string]interface{}{ - utils.AccountField: "1001", - utils.Destination: "1003", - }, + ev := &utils.CGREvent{ + ID: "WEIGHT_SORT", + Tenant: "cgrates.org", + Event: map[string]interface{}{ + utils.AccountField: "1001", + utils.Destination: "1003", }, } expSrtdRoutes := &engine.SortedRoutesList{ @@ -503,14 +499,12 @@ func testV1RtsCasesSortingRoutesWeightNotMatchingValue(t *testing.T) { t.Errorf("Unexpected result returned") } - ev := &engine.ArgsGetRoutes{ - CGREvent: &utils.CGREvent{ - ID: "WEIGHT_SORT", - Tenant: "cgrates.org", - Event: map[string]interface{}{ - utils.AccountField: "1001", - utils.Destination: "1003", - }, + ev := &utils.CGREvent{ + ID: "WEIGHT_SORT", + Tenant: "cgrates.org", + Event: map[string]interface{}{ + utils.AccountField: "1001", + utils.Destination: "1003", }, } expSrtdRoutes := &engine.SortedRoutesList{ @@ -549,16 +543,14 @@ func testV1RtsCasesSortingRoutesWeightNotMatchingValue(t *testing.T) { } func testV1RtsCasesSortingRoutesLowestCost(t *testing.T) { - ev := &engine.ArgsGetRoutes{ - CGREvent: &utils.CGREvent{ - ID: "LC_SORT", - Tenant: "cgrates.org", - Event: map[string]interface{}{ - utils.AccountField: "1002", - utils.Destination: "1003", - utils.SetupTime: "2013-06-01T00:00:00Z", - utils.Usage: "2m30s", - }, + ev := &utils.CGREvent{ + ID: "LC_SORT", + Tenant: "cgrates.org", + Event: map[string]interface{}{ + utils.AccountField: "1002", + utils.Destination: "1003", + utils.SetupTime: "2013-06-01T00:00:00Z", + utils.Usage: "2m30s", }, } expSrtdRoutes := &engine.SortedRoutesList{ @@ -597,16 +589,14 @@ func testV1RtsCasesSortingRoutesLowestCost(t *testing.T) { func testV1RtsCasesSortingRoutesLowestCostDefaultUsage(t *testing.T) { // default usage given by routes is 1m - ev := &engine.ArgsGetRoutes{ - CGREvent: &utils.CGREvent{ - ID: "LC_SORT", - Tenant: "cgrates.org", - Event: map[string]interface{}{ - utils.AccountField: "1002", - utils.Destination: "1003", - utils.SetupTime: "2013-06-01T00:00:00Z", - utils.AnswerTime: "2013-06-01T05:00:00Z", - }, + ev := &utils.CGREvent{ + ID: "LC_SORT", + Tenant: "cgrates.org", + Event: map[string]interface{}{ + utils.AccountField: "1002", + utils.Destination: "1003", + utils.SetupTime: "2013-06-01T00:00:00Z", + utils.AnswerTime: "2013-06-01T05:00:00Z", }, } expSrtdRoutes := &engine.SortedRoutesList{ @@ -699,17 +689,15 @@ func testV1RtsCasesSortingRoutesLCSetStatsAndResForMatching(t *testing.T) { func testV1RtsCasesSortingRoutesLowestCostStats(t *testing.T) { //not gonna match vendor1 because of its TotalUsage by allocating resources - ev := &engine.ArgsGetRoutes{ - CGREvent: &utils.CGREvent{ - ID: "LC_SORT", - Tenant: "cgrates.org", - Event: map[string]interface{}{ - utils.AccountField: "1002", - utils.Destination: "1003", - utils.SetupTime: "2013-06-01T00:00:00Z", - utils.AnswerTime: "2013-06-01T05:00:00Z", - utils.Usage: "2m30s", - }, + ev := &utils.CGREvent{ + ID: "LC_SORT", + Tenant: "cgrates.org", + Event: map[string]interface{}{ + utils.AccountField: "1002", + utils.Destination: "1003", + utils.SetupTime: "2013-06-01T00:00:00Z", + utils.AnswerTime: "2013-06-01T05:00:00Z", + utils.Usage: "2m30s", }, } expSrtdRoutes := &engine.SortedRoutesList{ @@ -775,17 +763,15 @@ func testV1RtsCasesSortingRoutesLowestCosMatchingAllRoutes(t *testing.T) { t.Errorf("Unexpected result returned: %s", result) } - ev := &engine.ArgsGetRoutes{ - CGREvent: &utils.CGREvent{ - ID: "LC_SORT", - Tenant: "cgrates.org", - Event: map[string]interface{}{ - utils.AccountField: "1002", - utils.Destination: "1003", - utils.SetupTime: "2013-06-01T00:00:00Z", - utils.AnswerTime: "2013-06-01T05:00:00Z", - utils.Usage: "2m30s", - }, + ev := &utils.CGREvent{ + ID: "LC_SORT", + Tenant: "cgrates.org", + Event: map[string]interface{}{ + utils.AccountField: "1002", + utils.Destination: "1003", + utils.SetupTime: "2013-06-01T00:00:00Z", + utils.AnswerTime: "2013-06-01T05:00:00Z", + utils.Usage: "2m30s", }, } expSrtdRoutes := &engine.SortedRoutesList{ @@ -838,18 +824,18 @@ func testV1RtsCasesSortingRoutesLowestCosMatchingAllRoutes(t *testing.T) { } func testV1RtsCasesSortingRoutesLowestCosMaxCost(t *testing.T) { - ev := &engine.ArgsGetRoutes{ - MaxCost: "0.35", - CGREvent: &utils.CGREvent{ - ID: "LC_SORT", - Tenant: "cgrates.org", - Event: map[string]interface{}{ - utils.AccountField: "1002", - utils.Destination: "1003", - utils.SetupTime: "2013-06-01T00:00:00Z", - utils.AnswerTime: "2013-06-01T05:00:00Z", - utils.Usage: "2m30s", - }, + ev := &utils.CGREvent{ + ID: "LC_SORT", + Tenant: "cgrates.org", + Event: map[string]interface{}{ + utils.AccountField: "1002", + utils.Destination: "1003", + utils.SetupTime: "2013-06-01T00:00:00Z", + utils.AnswerTime: "2013-06-01T05:00:00Z", + utils.Usage: "2m30s", + }, + APIOpts: map[string]interface{}{ + utils.OptsRoutesMaxCost: 0.35, }, } expSrtdRoutes := &engine.SortedRoutesList{ @@ -894,18 +880,18 @@ func testV1RtsCasesSortingRoutesLowestCosMaxCost(t *testing.T) { } func testV1RtsCasesSortingRoutesLowestCosMaxCostNotMatch(t *testing.T) { - ev := &engine.ArgsGetRoutes{ - MaxCost: "0.05", - CGREvent: &utils.CGREvent{ - ID: "LC_SORT", - Tenant: "cgrates.org", - Event: map[string]interface{}{ - utils.AccountField: "1002", - utils.Destination: "1003", - utils.SetupTime: "2013-06-01T00:00:00Z", - utils.AnswerTime: "2013-06-01T05:00:00Z", - utils.Usage: "2m30s", - }, + ev := &utils.CGREvent{ + ID: "LC_SORT", + Tenant: "cgrates.org", + Event: map[string]interface{}{ + utils.AccountField: "1002", + utils.Destination: "1003", + utils.SetupTime: "2013-06-01T00:00:00Z", + utils.AnswerTime: "2013-06-01T05:00:00Z", + utils.Usage: "2m30s", + }, + APIOpts: map[string]interface{}{ + utils.OptsRoutesMaxCost: 0.05, }, } var reply *engine.SortedRoutesList @@ -985,17 +971,15 @@ func testV1RtsCasesSortingRoutesProcessMetrics(t *testing.T) { func testV1RtsCasesSortingRoutesQOS(t *testing.T) { //not gonna match vendor3 because *tcc is not bigger that 6 - ev := &engine.ArgsGetRoutes{ - CGREvent: &utils.CGREvent{ - ID: "LC_SORT", - Tenant: "cgrates.org", - Event: map[string]interface{}{ - utils.AccountField: "1003", - utils.Destination: "1007", - utils.SetupTime: "2013-06-01T00:00:00Z", - utils.AnswerTime: "2013-06-01T05:00:00Z", - utils.Usage: "50s", - }, + ev := &utils.CGREvent{ + ID: "LC_SORT", + Tenant: "cgrates.org", + Event: map[string]interface{}{ + utils.AccountField: "1003", + utils.Destination: "1007", + utils.SetupTime: "2013-06-01T00:00:00Z", + utils.AnswerTime: "2013-06-01T05:00:00Z", + utils.Usage: "50s", }, } expSrtdRoutes := &engine.SortedRoutesList{ @@ -1057,17 +1041,15 @@ func testV1RtsCasesSortingRoutesQOSAllRoutes(t *testing.T) { } // match all 3 routes - ev := &engine.ArgsGetRoutes{ - CGREvent: &utils.CGREvent{ - ID: "LC_SORT", - Tenant: "cgrates.org", - Event: map[string]interface{}{ - utils.AccountField: "1003", - utils.Destination: "1007", - utils.SetupTime: "2013-06-01T00:00:00Z", - utils.AnswerTime: "2013-06-01T05:00:00Z", - utils.Usage: "50s", - }, + ev := &utils.CGREvent{ + ID: "LC_SORT", + Tenant: "cgrates.org", + Event: map[string]interface{}{ + utils.AccountField: "1003", + utils.Destination: "1007", + utils.SetupTime: "2013-06-01T00:00:00Z", + utils.AnswerTime: "2013-06-01T05:00:00Z", + utils.Usage: "50s", }, } expSrtdRoutes := &engine.SortedRoutesList{ @@ -1122,17 +1104,15 @@ func testV1RtsCasesSortingRoutesQOSAllRoutes(t *testing.T) { } func testV1RtsCasesSortingRoutesQOSNotFound(t *testing.T) { - ev := &engine.ArgsGetRoutes{ - CGREvent: &utils.CGREvent{ - ID: "LC_SORT", - Tenant: "cgrates.org", - Event: map[string]interface{}{ - utils.AccountField: "1008", - utils.Destination: "1007", - utils.SetupTime: "2013-06-01T00:00:00Z", - utils.AnswerTime: "2013-06-01T05:00:00Z", - utils.Usage: "50s", - }, + ev := &utils.CGREvent{ + ID: "LC_SORT", + Tenant: "cgrates.org", + Event: map[string]interface{}{ + utils.AccountField: "1008", + utils.Destination: "1007", + utils.SetupTime: "2013-06-01T00:00:00Z", + utils.AnswerTime: "2013-06-01T05:00:00Z", + utils.Usage: "50s", }, } var reply *engine.SortedRoutesList @@ -1182,14 +1162,12 @@ func testV1RtsCasesSortingRoutesAllocateResources(t *testing.T) { } func testV1RtsCasesSortingRoutesReasNotAllRoutes(t *testing.T) { - ev := &engine.ArgsGetRoutes{ - CGREvent: &utils.CGREvent{ - ID: "LC_SORT", - Tenant: "cgrates.org", - Event: map[string]interface{}{ - utils.AccountField: "1004", - utils.Destination: "1007", - }, + ev := &utils.CGREvent{ + ID: "LC_SORT", + Tenant: "cgrates.org", + Event: map[string]interface{}{ + utils.AccountField: "1004", + utils.Destination: "1007", }, } expSrtdRoutes := &engine.SortedRoutesList{ @@ -1243,14 +1221,12 @@ func testV1RtsCasesSortingRoutesReasAllRoutes(t *testing.T) { t.Errorf("Unexpected reply returned: %s", replyStr) } //allocate more resources for matching - ev := &engine.ArgsGetRoutes{ - CGREvent: &utils.CGREvent{ - ID: "LC_SORT", - Tenant: "cgrates.org", - Event: map[string]interface{}{ - utils.AccountField: "1004", - utils.Destination: "1007", - }, + ev := &utils.CGREvent{ + ID: "LC_SORT", + Tenant: "cgrates.org", + Event: map[string]interface{}{ + utils.AccountField: "1004", + utils.Destination: "1007", }, } expSrtdRoutes := &engine.SortedRoutesList{ @@ -1366,14 +1342,12 @@ func testV1RtsCasesRoutesProcessStatsForLoadRtsSorting(t *testing.T) { } func testV1RtsCasesRoutesLoadRtsSorting(t *testing.T) { - ev := &engine.ArgsGetRoutes{ - CGREvent: &utils.CGREvent{ - ID: "LC_SORT", - Tenant: "cgrates.org", - Event: map[string]interface{}{ - utils.AccountField: "1005", - //utils.Destination: "1007", - }, + ev := &utils.CGREvent{ + ID: "LC_SORT", + Tenant: "cgrates.org", + Event: map[string]interface{}{ + utils.AccountField: "1005", + //utils.Destination: "1007", }, } expSrtdRoutes := &engine.SortedRoutesList{ @@ -1418,16 +1392,14 @@ func testV1RtsCasesRoutesLoadRtsSorting(t *testing.T) { } func testV1RtsCasesSortRoutesHigherCostV2V3(t *testing.T) { - ev := &engine.ArgsGetRoutes{ - CGREvent: &utils.CGREvent{ - ID: "LC_SORT", - Tenant: "cgrates.org", - Event: map[string]interface{}{ - utils.AccountField: "1008", - utils.Destination: "1007", - utils.SetupTime: "2013-06-01T00:00:00Z", - utils.Usage: "3m25s", - }, + ev := &utils.CGREvent{ + ID: "LC_SORT", + Tenant: "cgrates.org", + Event: map[string]interface{}{ + utils.AccountField: "1008", + utils.Destination: "1007", + utils.SetupTime: "2013-06-01T00:00:00Z", + utils.Usage: "3m25s", }, } expSrtdRoutes := &engine.SortedRoutesList{ @@ -1544,16 +1516,14 @@ func testV1RtsCasesSortRoutesHigherCostAllocateRes(t *testing.T) { } func testV1RtsCasesSortRoutesHigherCostV1V3(t *testing.T) { - ev := &engine.ArgsGetRoutes{ - CGREvent: &utils.CGREvent{ - ID: "LC_SORT", - Tenant: "cgrates.org", - Event: map[string]interface{}{ - utils.AccountField: "1008", - utils.Destination: "1007", - utils.SetupTime: "2013-06-01T00:00:00Z", - utils.Usage: "3m25s", - }, + ev := &utils.CGREvent{ + ID: "LC_SORT", + Tenant: "cgrates.org", + Event: map[string]interface{}{ + utils.AccountField: "1008", + utils.Destination: "1007", + utils.SetupTime: "2013-06-01T00:00:00Z", + utils.Usage: "3m25s", }, } expSrtdRoutes := &engine.SortedRoutesList{ @@ -1610,16 +1580,14 @@ func testV1RtsCasesSortRoutesHigherCostAllRoutes(t *testing.T) { } else if result != "RES_GRP1" { t.Errorf("Unexpected result returned: %s", result) } - ev := &engine.ArgsGetRoutes{ - CGREvent: &utils.CGREvent{ - ID: "LC_SORT", - Tenant: "cgrates.org", - Event: map[string]interface{}{ - utils.AccountField: "1008", - utils.Destination: "1007", - utils.SetupTime: "2013-06-01T00:00:00Z", - utils.Usage: "3m25s", - }, + ev := &utils.CGREvent{ + ID: "LC_SORT", + Tenant: "cgrates.org", + Event: map[string]interface{}{ + utils.AccountField: "1008", + utils.Destination: "1007", + utils.SetupTime: "2013-06-01T00:00:00Z", + utils.Usage: "3m25s", }, } expSrtdRoutes := &engine.SortedRoutesList{ diff --git a/general_tests/sessionroutes_it_test.go b/general_tests/sessionroutes_it_test.go index a53a64b1c..8e2d60a4b 100644 --- a/general_tests/sessionroutes_it_test.go +++ b/general_tests/sessionroutes_it_test.go @@ -132,7 +132,7 @@ func testSesRoutesAuthorizeEvent(t *testing.T) { utils.SetupTime: time.Date(2018, 8, 24, 16, 00, 00, 0, time.UTC), utils.Usage: time.Minute, }, - APIOpts: map[string]interface{}{utils.OptsRoutesProfilesCount: 1}, + APIOpts: map[string]interface{}{utils.OptsRoutesProfileCount: 1}, } args := sessions.NewV1AuthorizeArgs(false, []string{}, false, []string{}, false, []string{}, false, false, @@ -263,7 +263,7 @@ func testSesRoutesProcessMessage(t *testing.T) { utils.SetupTime: time.Date(2018, 8, 24, 16, 00, 00, 0, time.UTC), utils.Usage: time.Minute, }, - APIOpts: map[string]interface{}{utils.OptsRoutesProfilesCount: 1}, + APIOpts: map[string]interface{}{utils.OptsRoutesProfileCount: 1}, } args := sessions.NewV1ProcessMessageArgs(false, []string{}, false, []string{}, false, []string{}, false, false, @@ -396,7 +396,7 @@ func testSesRoutesProcessEvent(t *testing.T) { utils.SetupTime: time.Date(2018, 8, 24, 16, 00, 00, 0, time.UTC), utils.Usage: time.Minute, }, - APIOpts: map[string]interface{}{utils.OptsRoutesProfilesCount: 1}, + APIOpts: map[string]interface{}{utils.OptsRoutesProfileCount: 1}, } args := sessions.V1ProcessEventArgs{ Flags: []string{"*routes"}, diff --git a/sessions/sessions.go b/sessions/sessions.go index 22226ba69..7436b0f98 100644 --- a/sessions/sessions.go +++ b/sessions/sessions.go @@ -3827,15 +3827,9 @@ func (sS *SessionS) getRoutes(cgrEv *utils.CGREvent, pag utils.Paginator, ignore if acd, has := cgrEv.Event[utils.ACD]; has { cgrEv.Event[utils.Usage] = acd } - sArgs := &engine.ArgsGetRoutes{ - CGREvent: cgrEv, - Paginator: pag, - IgnoreErrors: ignoreErrors, - MaxCost: maxCost, - } - sArgs.SetCloneable(clnb) + cgrEv.SetCloneable(clnb) if err = sS.connMgr.Call(sS.cgrCfg.SessionSCfg().RouteSConns, nil, utils.RouteSv1GetRoutes, - sArgs, &routesReply); err != nil { + cgrEv, &routesReply); err != nil { return routesReply, utils.NewErrRouteS(err) } return diff --git a/sessions/sessionscover_test.go b/sessions/sessionscover_test.go index cddecd389..32bd58137 100644 --- a/sessions/sessionscover_test.go +++ b/sessions/sessionscover_test.go @@ -3748,7 +3748,7 @@ func TestBiRPCv1ProcessEvent(t *testing.T) { return utils.ErrNotImplemented }, utils.RouteSv1GetRoutes: func(args interface{}, reply interface{}) error { - if args.(*engine.ArgsGetRoutes).ID == "SECOND_ID" { + if args.(*utils.CGREvent).ID == "SECOND_ID" { *reply.(*engine.SortedRoutesList) = engine.SortedRoutesList{{ ProfileID: "ROUTE_PRFID", Routes: []*engine.SortedRoute{ diff --git a/utils/cgrevent_test.go b/utils/cgrevent_test.go index 21868af95..e41dde65b 100644 --- a/utils/cgrevent_test.go +++ b/utils/cgrevent_test.go @@ -318,16 +318,16 @@ func TestCGREventconsumeRoutePaginator(t *testing.T) { if err != nil { t.Error(err) } - //check if *routes_limit and *routes_offset was deleted + //check if *rouLimit and *rouOffset was deleted if _, has := opts[OptsRoutesLimit]; has { - t.Errorf("*routes_limit wasn't deleted") + t.Errorf("*rouLimit wasn't deleted") } else if _, has := opts[OptsRoutesOffset]; has { - t.Errorf("*routes_offset wasn't deleted") + t.Errorf("*rouOffset wasn't deleted") } if !reflect.DeepEqual(eOut, rcv) { t.Errorf("Expecting: %+v, received: %+v", eOut, rcv) } - //check without *routes_limit, but with *routes_offset + //check without *rouLimit, but with *rouOffset opts = map[string]interface{}{ OptsRoutesOffset: 20, } @@ -339,16 +339,16 @@ func TestCGREventconsumeRoutePaginator(t *testing.T) { if err != nil { t.Error(err) } - //check if *routes_limit and *routes_offset was deleted + //check if *rouLimit and *rouOffset was deleted if _, has := opts[OptsRoutesLimit]; has { - t.Errorf("*routes_limit wasn't deleted") + t.Errorf("*rouLimit wasn't deleted") } else if _, has := opts[OptsRoutesOffset]; has { - t.Errorf("*routes_offset wasn't deleted") + t.Errorf("*rouOffset wasn't deleted") } if !reflect.DeepEqual(eOut, rcv) { t.Errorf("Expecting: %+v, received: %+v", eOut, rcv) } - //check with notAnInt at *routes_limit + //check with notAnInt at *rouLimit opts = map[string]interface{}{ OptsRoutesLimit: "Not an int", } @@ -360,7 +360,7 @@ func TestCGREventconsumeRoutePaginator(t *testing.T) { if !reflect.DeepEqual(eOut, rcv) { t.Errorf("Expecting: %+v, received: %+v", eOut, rcv) } - //check with notAnInt at and *routes_offset + //check with notAnInt at and *rouOffset opts = map[string]interface{}{ OptsRoutesOffset: "Not an int", } diff --git a/utils/consts.go b/utils/consts.go index f95d292c6..896235392 100644 --- a/utils/consts.go +++ b/utils/consts.go @@ -2229,6 +2229,13 @@ const ( MetaUsageTTLCfg = "*usageTTL" MetaUnitsCfg = "*units" + // RoutesCfg + MetaProfileCountCfg = "*profileCount" + MetaIgnoreErrorsCfg = "*ignoreErrors" + MetaMaxCostCfg = "*maxCost" + MetaLimitCfg = "*limit" + MetaOffsetCfg = "*offset" + // AnalyzerSCfg CleanupIntervalCfg = "cleanup_interval" IndexTypeCfg = "index_type" @@ -2401,11 +2408,12 @@ var CGROptionsSet = NewStringSet([]string{OptsSessionsTTL, OptsDebitInterval, OptsStirATest, OptsStirPayloadMaxDuration, OptsStirIdentity, OptsStirOriginatorTn, OptsStirOriginatorURI, OptsStirDestinationTn, OptsStirDestinationURI, OptsStirPublicKeyPath, OptsStirPrivateKeyPath, OptsAPIKey, OptsRouteID, OptsContext, - OptsAttributesProcessRuns, OptsAttributesProfileIDs, OptsRoutesLimit, OptsRoutesOffset, OptsChargeable, - RemoteHostOpt, CacheOpt, OptsRoutesProfilesCount, OptsDispatchersProfilesCount, - OptsAttributesProfileRuns, OptsAttributesProfileIgnoreFilters, OptsStatsProfileIDs, - OptsStatsProfileIgnoreFilters, OptsThresholdsProfileIDs, OptsThresholdsProfileIgnoreFilters, - OptsResourcesUsageID, OptsResourcesUsageTTL, OptsResourcesUnits}) + OptsAttributesProcessRuns, OptsAttributesProfileIDs, OptsRoutesLimit, OptsRoutesOffset, + OptsRoutesIgnoreErrors, OptsRoutesMaxCost, OptsChargeable, RemoteHostOpt, CacheOpt, + OptsRoutesProfileCount, OptsDispatchersProfilesCount, OptsAttributesProfileRuns, + OptsAttributesProfileIgnoreFilters, OptsStatsProfileIDs, OptsStatsProfileIgnoreFilters, + OptsThresholdsProfileIDs, OptsThresholdsProfileIgnoreFilters, OptsResourcesUsageID, OptsResourcesUsageTTL, + OptsResourcesUnits}) // EventExporter metrics const ( @@ -2427,9 +2435,6 @@ const ( // Event Opts const ( - OptsRoutesProfilesCount = "*routesProfilesCount" - OptsRoutesLimit = "*routes_limit" - OptsRoutesOffset = "*routes_offset" OptsSessionsTTL = "*sessionsTTL" OptsSessionsTTLMaxDelay = "*sessionsTTLMaxDelay" OptsSessionsTTLLastUsed = "*sessionsTTLLastUsed" @@ -2457,6 +2462,12 @@ const ( OptsResourcesUsageID = "*rsUsageID" OptsResourcesUsageTTL = "*rsUsageTTL" OptsResourcesUnits = "*rsUnits" + // Routes + OptsRoutesProfileCount = "*rouProfileCount" + OptsRoutesLimit = "*rouLimit" + OptsRoutesOffset = "*rouOffset" + OptsRoutesIgnoreErrors = "*rouIgnoreErrors" + OptsRoutesMaxCost = "*rouMaxCost" // Stats OptsStatsProfileIDs = "*stsProfileIDs" OptsStatsProfileIgnoreFilters = "*stsProfileIgnoreFilters"