Add test for *load strategy from SupplierS

This commit is contained in:
TeoV
2020-02-20 15:53:34 +02:00
committed by Dan Christian Bogos
parent 743c4e8a38
commit 35130763bc
5 changed files with 229 additions and 4 deletions

View File

@@ -24,4 +24,5 @@ cgrates.org,FLTR_QOS_SP2,*gte,~*vars.*tcd,11.0,
cgrates.org,FLTR_SPP_QOS_2,*string,~*req.DistinctMatch,*qos_filtred2,2014-07-29T15:00:00Z
cgrates.org,FLTR_QOS_SP1_2,*gte,~*vars.Cost,0.1,2014-07-29T15:00:00Z
cgrates.org,FLTR_QOS_SP2_2,*gte,~*vars.Cost,0.2,2014-07-29T15:00:00Z
cgrates.org,FLTR_TEST,*string,~*req.Subject,TEST,2014-07-29T15:00:00Z
cgrates.org,FLTR_TEST,*string,~*req.Subject,TEST,2014-07-29T15:00:00Z
cgrates.org,FLTR_SPP_LOAD_DIST,*string,~*req.DistinctMatch,LoadDistStrategy,2014-07-29T15:00:00Z
1 #Tenant[0] ID[1] Type[2] Path[3] Values[4] ActivationInterval[5]
24 cgrates.org FLTR_SPP_QOS_2 *string ~*req.DistinctMatch *qos_filtred2 2014-07-29T15:00:00Z
25 cgrates.org FLTR_QOS_SP1_2 *gte ~*vars.Cost 0.1 2014-07-29T15:00:00Z
26 cgrates.org FLTR_QOS_SP2_2 *gte ~*vars.Cost 0.2 2014-07-29T15:00:00Z
27 cgrates.org FLTR_TEST *string ~*req.Subject TEST 2014-07-29T15:00:00Z
28 cgrates.org FLTR_SPP_LOAD_DIST *string ~*req.DistinctMatch LoadDistStrategy 2014-07-29T15:00:00Z

View File

@@ -2,4 +2,7 @@
cgrates.org,Stat_1,FLTR_STAT_1,2014-07-29T15:00:00Z,100,1s,0,*acd;*tcd;*asr,,false,true,30,*none
cgrates.org,Stat_1_1,FLTR_STAT_1_1,2014-07-29T15:00:00Z,100,1s,0,*acd;*tcd;*pdd,,false,true,30,*none
cgrates.org,Stat_2,FLTR_STAT_2,2014-07-29T15:00:00Z,100,1s,0,*acd;*tcd;*asr,,false,true,30,*none
cgrates.org,Stat_3,FLTR_STAT_3,2014-07-29T15:00:00Z,100,1s,0,*acd;*tcd;*asr,,false,true,30,*none
cgrates.org,Stat_3,FLTR_STAT_3,2014-07-29T15:00:00Z,100,1s,0,*acd;*tcd;*asr,,false,true,30,*none
cgrates.org,Stat_Supplier1,*string:~*req.StatID:Stat_Supplier1,2014-07-29T15:00:00Z,100,1s,0,*sum:~LoadReq,,true,true,30,*none
cgrates.org,Stat_Supplier2,*string:~*req.StatID:Stat_Supplier2,2014-07-29T15:00:00Z,100,1s,0,*sum:~LoadReq,,true,true,30,*none
cgrates.org,Stat_Supplier3,*string:~*req.StatID:Stat_Supplier3,2014-07-29T15:00:00Z,100,1s,0,*sum:~LoadReq,,true,true,30,*none
1 #Tenant[0] Id[1] FilterIDs[2] ActivationInterval[3] QueueLength[4] TTL[5] MinItems[6] Metrics[7] MetricFilterIDs[8] Stored[9] Blocker[10] Weight[11] ThresholdIDs[12]
2 cgrates.org Stat_1 FLTR_STAT_1 2014-07-29T15:00:00Z 100 1s 0 *acd;*tcd;*asr false true 30 *none
3 cgrates.org Stat_1_1 FLTR_STAT_1_1 2014-07-29T15:00:00Z 100 1s 0 *acd;*tcd;*pdd false true 30 *none
4 cgrates.org Stat_2 FLTR_STAT_2 2014-07-29T15:00:00Z 100 1s 0 *acd;*tcd;*asr false true 30 *none
5 cgrates.org Stat_3 FLTR_STAT_3 2014-07-29T15:00:00Z 100 1s 0 *acd;*tcd;*asr false true 30 *none
6 cgrates.org Stat_Supplier1 *string:~*req.StatID:Stat_Supplier1 2014-07-29T15:00:00Z 100 1s 0 *sum:~LoadReq true true 30 *none
7 cgrates.org Stat_Supplier2 *string:~*req.StatID:Stat_Supplier2 2014-07-29T15:00:00Z 100 1s 0 *sum:~LoadReq true true 30 *none
8 cgrates.org Stat_Supplier3 *string:~*req.StatID:Stat_Supplier3 2014-07-29T15:00:00Z 100 1s 0 *sum:~LoadReq true true 30 *none

View File

@@ -27,4 +27,7 @@ cgrates.org,SPL_QOS_FILTRED2,FLTR_SPP_QOS_2,2017-11-27T00:00:00Z,*qos,*acd;*tcd;
cgrates.org,SPL_QOS_FILTRED2,,,,,supplier2,FLTR_QOS_SP2_2,,RP_RETAIL1,,Stat_2,20,,,
cgrates.org,SPL_QOS_FILTRED2,,,,,supplier3,,,,,Stat_3,35,,,
cgrates.org,SPL_LCR,FLTR_TEST,2017-11-27T00:00:00Z,*lc,,supplier_1,,,RP_TEST_1,,,10,,,50
cgrates.org,SPL_LCR,,,,,supplier_2,,,RP_TEST_2,,,,,,
cgrates.org,SPL_LCR,,,,,supplier_2,,,RP_TEST_2,,,,,,
cgrates.org,SPL_LOAD_DIST,FLTR_SPP_LOAD_DIST,,*load,supplier1:2;supplier2:7;*default:5,supplier1,,,,,Stat_Supplier1:*sum:~LoadReq,10,false,,20
cgrates.org,SPL_LOAD_DIST,,,,,supplier2,,,,,Stat_Supplier2:*sum:~LoadReq,20,,,
cgrates.org,SPL_LOAD_DIST,,,,,supplier3,,,,,Stat_Supplier3:*sum:~LoadReq,35,,,
1 #Tenant ID FilterIDs ActivationInterval Sorting SortingParameters SupplierID SupplierFilterIDs SupplierAccountIDs SupplierRatingPlanIDs SupplierResourceIDs SupplierStatIDs SupplierWeight SupplierBlocker SupplierParameters Weight
27 cgrates.org SPL_QOS_FILTRED2 supplier2 FLTR_QOS_SP2_2 RP_RETAIL1 Stat_2 20
28 cgrates.org SPL_QOS_FILTRED2 supplier3 Stat_3 35
29 cgrates.org SPL_LCR FLTR_TEST 2017-11-27T00:00:00Z *lc supplier_1 RP_TEST_1 10 50
30 cgrates.org SPL_LCR supplier_2 RP_TEST_2
31 cgrates.org SPL_LOAD_DIST FLTR_SPP_LOAD_DIST *load supplier1:2;supplier2:7;*default:5 supplier1 Stat_Supplier1:*sum:~LoadReq 10 false 20
32 cgrates.org SPL_LOAD_DIST supplier2 Stat_Supplier2:*sum:~LoadReq 20
33 cgrates.org SPL_LOAD_DIST supplier3 Stat_Supplier3:*sum:~LoadReq 35

View File

@@ -52,7 +52,13 @@ func (ws *LoadDistributionSorter) SortSuppliers(prflID string,
return nil, err
} else if pass && srtSpl != nil {
// Add the ratio in SortingData so we can used it later in SortLoadDistribution
srtSpl.SortingData[utils.Ratio] = s.cacheSupplier[utils.MetaRatio].(float64)
floatRatio, err := utils.IfaceAsFloat64(s.cacheSupplier[utils.MetaRatio])
if err != nil {
utils.Logger.Warning(
fmt.Sprintf("<%s> cannot convert ratio <%s> to float64 supplier: <%s>",
utils.SupplierS, s.cacheSupplier[utils.MetaRatio], s.ID))
}
srtSpl.SortingData[utils.Ratio] = floatRatio
sortedSuppls.SortedSuppliers = append(sortedSuppls.SortedSuppliers, srtSpl)
}
}

View File

@@ -56,6 +56,9 @@ var (
//tests for *reds sorting strategy
testV1SplSAddNewSplPrf2,
testV1SplSGetSortedSuppliers2,
//tests for *load sorting strategy
testV1SplSPopulateStats,
testV1SplSGetSoredSuppliersWithLoad,
testV1SplSStopEngine,
}
)
@@ -544,6 +547,215 @@ func testV1SplSGetSortedSuppliers2(t *testing.T) {
}
}
func testV1SplSPopulateStats(t *testing.T) {
// in this test we simulate some Stat Requests
// so we can check the metrics in Suppliers for *load strategy
var reply []string
expected := []string{"Stat_Supplier1"}
ev1 := &engine.StatsArgsProcessEvent{
CGREvent: &utils.CGREvent{
Tenant: "cgrates.org",
ID: "event1",
Event: map[string]interface{}{
"LoadReq": 1,
"StatID": "Stat_Supplier1",
},
},
}
if err := splSv1Rpc.Call(utils.StatSv1ProcessEvent, ev1, &reply); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(reply, expected) {
t.Errorf("Expecting: %+v, received: %+v", expected, reply)
}
expected = []string{"Stat_Supplier1"}
ev1 = &engine.StatsArgsProcessEvent{
CGREvent: &utils.CGREvent{
Tenant: "cgrates.org",
ID: "event2",
Event: map[string]interface{}{
"LoadReq": 1,
"StatID": "Stat_Supplier1",
},
},
}
if err := splSv1Rpc.Call(utils.StatSv1ProcessEvent, ev1, &reply); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(reply, expected) {
t.Errorf("Expecting: %+v, received: %+v", expected, reply)
}
var metrics map[string]string
expectedMetrics := map[string]string{
utils.ConcatenatedKey(utils.MetaSum, utils.DynamicDataPrefix+"LoadReq"): "2",
}
if err := splSv1Rpc.Call(utils.StatSv1GetQueueStringMetrics,
&utils.TenantIDWithArgDispatcher{TenantID: &utils.TenantID{Tenant: "cgrates.org", ID: "Stat_Supplier1"}},
&metrics); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(expectedMetrics, metrics) {
t.Errorf("expecting: %+v, received reply: %s", expectedMetrics, metrics)
}
expected = []string{"Stat_Supplier2"}
ev1 = &engine.StatsArgsProcessEvent{
CGREvent: &utils.CGREvent{
Tenant: "cgrates.org",
ID: "event3",
Event: map[string]interface{}{
"LoadReq": 1,
"StatID": "Stat_Supplier2",
},
},
}
if err := splSv1Rpc.Call(utils.StatSv1ProcessEvent, ev1, &reply); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(reply, expected) {
t.Errorf("Expecting: %+v, received: %+v", expected, reply)
}
expected = []string{"Stat_Supplier2"}
ev1 = &engine.StatsArgsProcessEvent{
CGREvent: &utils.CGREvent{
Tenant: "cgrates.org",
ID: "event4",
Event: map[string]interface{}{
"LoadReq": 1,
"StatID": "Stat_Supplier2",
},
},
}
if err := splSv1Rpc.Call(utils.StatSv1ProcessEvent, ev1, &reply); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(reply, expected) {
t.Errorf("Expecting: %+v, received: %+v", expected, reply)
}
if err := splSv1Rpc.Call(utils.StatSv1GetQueueStringMetrics,
&utils.TenantIDWithArgDispatcher{TenantID: &utils.TenantID{Tenant: "cgrates.org", ID: "Stat_Supplier2"}},
&metrics); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(expectedMetrics, metrics) {
t.Errorf("expecting: %+v, received reply: %s", expectedMetrics, metrics)
}
expected = []string{"Stat_Supplier3"}
ev1 = &engine.StatsArgsProcessEvent{
CGREvent: &utils.CGREvent{
Tenant: "cgrates.org",
ID: "event5",
Event: map[string]interface{}{
"LoadReq": 1,
"StatID": "Stat_Supplier3",
},
},
}
if err := splSv1Rpc.Call(utils.StatSv1ProcessEvent, ev1, &reply); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(reply, expected) {
t.Errorf("Expecting: %+v, received: %+v", expected, reply)
}
expected = []string{"Stat_Supplier3"}
ev1 = &engine.StatsArgsProcessEvent{
CGREvent: &utils.CGREvent{
Tenant: "cgrates.org",
ID: "event6",
Event: map[string]interface{}{
"LoadReq": 1,
"StatID": "Stat_Supplier3",
},
},
}
if err := splSv1Rpc.Call(utils.StatSv1ProcessEvent, ev1, &reply); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(reply, expected) {
t.Errorf("Expecting: %+v, received: %+v", expected, reply)
}
expected = []string{"Stat_Supplier3"}
ev1 = &engine.StatsArgsProcessEvent{
CGREvent: &utils.CGREvent{
Tenant: "cgrates.org",
ID: "event7",
Event: map[string]interface{}{
"LoadReq": 1,
"StatID": "Stat_Supplier3",
},
},
}
if err := splSv1Rpc.Call(utils.StatSv1ProcessEvent, ev1, &reply); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(reply, expected) {
t.Errorf("Expecting: %+v, received: %+v", expected, reply)
}
expectedMetrics = map[string]string{
utils.ConcatenatedKey(utils.MetaSum, utils.DynamicDataPrefix+"LoadReq"): "3",
}
if err := splSv1Rpc.Call(utils.StatSv1GetQueueStringMetrics,
&utils.TenantIDWithArgDispatcher{TenantID: &utils.TenantID{Tenant: "cgrates.org", ID: "Stat_Supplier3"}},
&metrics); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(expectedMetrics, metrics) {
t.Errorf("expecting: %+v, received reply: %s", expectedMetrics, metrics)
}
}
func testV1SplSGetSoredSuppliersWithLoad(t *testing.T) {
ev := &engine.ArgsGetSuppliers{
CGREvent: &utils.CGREvent{
Tenant: "cgrates.org",
ID: "testV1SplSGetSoredSuppliersWithLoad",
Event: map[string]interface{}{
"DistinctMatch": "LoadDistStrategy",
},
},
}
expSuppliers := []*engine.SortedSupplier{
&engine.SortedSupplier{
SupplierID: "supplier2",
SupplierParameters: "",
SortingData: map[string]interface{}{
"Load": 2.0,
"Ratio": 7.0,
"Weight": 20.0},
},
&engine.SortedSupplier{
SupplierID: "supplier3",
SupplierParameters: "",
SortingData: map[string]interface{}{
"Load": 3.0,
"Ratio": 5.0,
"Weight": 35.0},
},
&engine.SortedSupplier{
SupplierID: "supplier1",
SupplierParameters: "",
SortingData: map[string]interface{}{
"Load": 2.0,
"Ratio": 2.0,
"Weight": 10.0},
},
}
var suplsReply engine.SortedSuppliers
if err := splSv1Rpc.Call(utils.SupplierSv1GetSuppliers,
ev, &suplsReply); err != nil {
t.Error(err)
} else {
if suplsReply.ProfileID != "SPL_LOAD_DIST" {
t.Errorf("Expecting: SPL_LOAD_DIST, received: %s",
suplsReply.ProfileID)
}
if !reflect.DeepEqual(suplsReply.SortedSuppliers, expSuppliers) {
t.Errorf("Expecting: %+v, \n received: %+v",
utils.ToJSON(expSuppliers), utils.ToJSON(suplsReply.SortedSuppliers))
}
}
}
func testV1SplSStopEngine(t *testing.T) {
if err := engine.KillEngine(100); err != nil {
t.Error(err)