From f70b9a11f1f4fd7975b5c2efd2e147e813f5dda0 Mon Sep 17 00:00:00 2001 From: TeoV Date: Mon, 30 Jul 2018 07:42:10 -0400 Subject: [PATCH] Update QOS strategy to show metric:StatID:value --- apier/v1/suppliers_it_test.go | 138 ++++++++++++++++++++------ data/tariffplans/testit/Filters.csv | 4 +- data/tariffplans/testit/Stats.csv | 1 + data/tariffplans/testit/Suppliers.csv | 7 +- engine/libsuppliers.go | 11 +- engine/libsuppliers_test.go | 72 +++++++------- engine/spls_qos.go | 41 ++++++-- engine/suppliers.go | 3 +- 8 files changed, 193 insertions(+), 84 deletions(-) diff --git a/apier/v1/suppliers_it_test.go b/apier/v1/suppliers_it_test.go index 1e6f3ad50..5274c6573 100644 --- a/apier/v1/suppliers_it_test.go +++ b/apier/v1/suppliers_it_test.go @@ -57,6 +57,7 @@ var sTestsSupplierSV1 = []func(t *testing.T){ testV1SplSPolulateStatsForQOS, testV1SplSGetQOSSuppliers, testV1SplSGetQOSSuppliers2, + testV1SplSGetQOSSuppliers3, testV1SplSGetSupplierWithoutFilter, testV1SplSSetSupplierProfiles, testV1SplSUpdateSupplierProfiles, @@ -482,6 +483,25 @@ func testV1SplSPolulateStatsForQOS(t *testing.T) { } else if !reflect.DeepEqual(reply, expected) { t.Errorf("Expecting: %+v, received: %+v", expected, reply) } + + expected = []string{"Stat_1_1"} + ev1 = utils.CGREvent{ + Tenant: "cgrates.org", + ID: "event3", + Event: map[string]interface{}{ + "Stat": "Stat1_1", + utils.AnswerTime: time.Date(2014, 7, 14, 14, 25, 0, 0, time.UTC), + utils.Usage: time.Duration(11 * time.Second), + utils.COST: 12.5, + utils.PDD: time.Duration(12 * time.Second), + }, + } + 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) + } + } func testV1SplSGetQOSSuppliers(t *testing.T) { @@ -498,30 +518,34 @@ func testV1SplSGetQOSSuppliers(t *testing.T) { ProfileID: "SPL_QOS_1", Sorting: utils.MetaQOS, SortedSuppliers: []*engine.SortedSupplier{ - &engine.SortedSupplier{ - SupplierID: "supplier1", - SortingData: map[string]interface{}{ - utils.MetaACD: 11.0, - utils.MetaASR: 100.0, - utils.MetaTCD: 22.0, - utils.Weight: 10.0, - }, - }, &engine.SortedSupplier{ SupplierID: "supplier3", SortingData: map[string]interface{}{ - utils.MetaACD: 11.0, - utils.MetaASR: 100.0, - utils.MetaTCD: 11.0, + "*acd:Stat_3": 11.0, + "*asr:Stat_3": 100.0, + "*tcd:Stat_3": 11.0, utils.Weight: 35.0, }, }, + &engine.SortedSupplier{ + SupplierID: "supplier1", + SortingData: map[string]interface{}{ + "*acd:Stat_1": 11.0, + "*acd:Stat_1_1": 11.0, + "*asr:Stat_1": 100.0, + "*pdd:Stat_1_1": 12.0, + "*tcd:Stat_1": 22.0, + "*tcd:Stat_1_1": 11.0, + utils.Weight: 10.0, + }, + }, + &engine.SortedSupplier{ SupplierID: "supplier2", SortingData: map[string]interface{}{ - utils.MetaACD: 5.5, - utils.MetaASR: 100.0, - utils.MetaTCD: 11.0, + "*acd:Stat_2": 5.5, + "*asr:Stat_2": 100.0, + "*tcd:Stat_2": 11.0, utils.Weight: 20.0, }, }, @@ -554,31 +578,31 @@ func testV1SplSGetQOSSuppliers2(t *testing.T) { &engine.SortedSupplier{ SupplierID: "supplier3", SortingData: map[string]interface{}{ - utils.MetaACD: 11.0, - utils.MetaASR: 100.0, - utils.MetaTCD: 11.0, - utils.MetaPDD: -1.0, + "*acd:Stat_3": 11.0, + "*asr:Stat_3": 100.0, + "*tcd:Stat_3": 11.0, utils.Weight: 35.0, }, }, &engine.SortedSupplier{ SupplierID: "supplier2", SortingData: map[string]interface{}{ - utils.MetaACD: 5.5, - utils.MetaASR: 100.0, - utils.MetaTCD: 11.0, - utils.MetaPDD: -1.0, + "*acd:Stat_2": 5.5, + "*asr:Stat_2": 100.0, + "*tcd:Stat_2": 11.0, utils.Weight: 20.0, }, }, &engine.SortedSupplier{ SupplierID: "supplier1", SortingData: map[string]interface{}{ - utils.MetaACD: 11.0, - utils.MetaASR: 100.0, - utils.MetaTCD: 22.0, - utils.MetaPDD: -1.0, - utils.Weight: 10.0, + "*acd:Stat_1": 11.0, + "*acd:Stat_1_1": 11.0, + "*asr:Stat_1": 100.0, + "*pdd:Stat_1_1": 12.0, + "*tcd:Stat_1": 22.0, + "*tcd:Stat_1_1": 11.0, + utils.Weight: 10.0, }, }, }, @@ -591,8 +615,64 @@ func testV1SplSGetQOSSuppliers2(t *testing.T) { t.Errorf("Expecting: %s, received: %s", utils.ToJSON(eSpls), utils.ToJSON(suplsReply)) } - } + +func testV1SplSGetQOSSuppliers3(t *testing.T) { + ev := &engine.ArgsGetSuppliers{ + CGREvent: utils.CGREvent{ + Tenant: "cgrates.org", + ID: "testV1SplSGetQOSSuppliers", + Event: map[string]interface{}{ + "DistincMatch": "*qos3", + }, + }, + } + eSpls := engine.SortedSuppliers{ + ProfileID: "SPL_QOS_3", + Sorting: utils.MetaQOS, + SortedSuppliers: []*engine.SortedSupplier{ + &engine.SortedSupplier{ + SupplierID: "supplier1", + SortingData: map[string]interface{}{ + "*acd:Stat_1": 11.0, + "*acd:Stat_1_1": 11.0, + "*asr:Stat_1": 100.0, + "*pdd:Stat_1_1": 12.0, + "*tcd:Stat_1": 22.0, + "*tcd:Stat_1_1": 11.0, + utils.Weight: 10.0, + }, + }, + &engine.SortedSupplier{ + SupplierID: "supplier3", + SortingData: map[string]interface{}{ + "*acd:Stat_3": 11.0, + "*asr:Stat_3": 100.0, + "*tcd:Stat_3": 11.0, + utils.Weight: 35.0, + }, + }, + &engine.SortedSupplier{ + SupplierID: "supplier2", + SortingData: map[string]interface{}{ + "*acd:Stat_2": 5.5, + "*asr:Stat_2": 100.0, + "*tcd:Stat_2": 11.0, + utils.Weight: 20.0, + }, + }, + }, + } + var suplsReply engine.SortedSuppliers + if err := splSv1Rpc.Call(utils.SupplierSv1GetSuppliers, + ev, &suplsReply); err != nil { + t.Error(err) + } else if !reflect.DeepEqual(eSpls, suplsReply) { + t.Errorf("Expecting: %s, received: %s", + utils.ToJSON(eSpls), utils.ToJSON(suplsReply)) + } +} + func testV1SplSGetSupplierWithoutFilter(t *testing.T) { ev := &engine.ArgsGetSuppliers{ CGREvent: utils.CGREvent{ diff --git a/data/tariffplans/testit/Filters.csv b/data/tariffplans/testit/Filters.csv index 0b3678dd4..407ecf78a 100644 --- a/data/tariffplans/testit/Filters.csv +++ b/data/tariffplans/testit/Filters.csv @@ -14,4 +14,6 @@ cgrates.org,FLTR_SPP_3,*string,DistincMatch,*qos,2014-07-29T15:00:00Z cgrates.org,FLTR_STAT_1,*string,Account,1001,2014-07-29T15:00:00Z cgrates.org,FLTR_STAT_2,*string,Account,1002,2014-07-29T15:00:00Z cgrates.org,FLTR_STAT_3,*string,Account,1003,2014-07-29T15:00:00Z -cgrates.org,FLTR_SPP_4,*string,DistincMatch,*qos2,2014-07-29T15:00:00Z \ No newline at end of file +cgrates.org,FLTR_SPP_4,*string,DistincMatch,*qos2,2014-07-29T15:00:00Z +cgrates.org,FLTR_SPP_5,*string,DistincMatch,*qos3,2014-07-29T15:00:00Z +cgrates.org,FLTR_STAT_1_1,*string,Stat,Stat1_1,2014-07-29T15:00:00Z \ No newline at end of file diff --git a/data/tariffplans/testit/Stats.csv b/data/tariffplans/testit/Stats.csv index b25eabc06..8032b244f 100644 --- a/data/tariffplans/testit/Stats.csv +++ b/data/tariffplans/testit/Stats.csv @@ -1,4 +1,5 @@ #Tenant[0],Id[1],FilterIDs[2],ActivationInterval[3],QueueLength[4],TTL[5],Metrics[6],MetricParams[7],Blocker[8],Stored[9],Weight[10],MinItems[11],ThresholdIDs[12] cgrates.org,Stat_1,FLTR_STAT_1,2014-07-29T15:00:00Z,100,1s,*acd;*tcd;*asr,,false,true,30,0, +cgrates.org,Stat_1_1,FLTR_STAT_1_1,2014-07-29T15:00:00Z,100,1s,*acd;*tcd;*pdd,,false,true,30,0, cgrates.org,Stat_2,FLTR_STAT_2,2014-07-29T15:00:00Z,100,1s,*acd;*tcd;*asr,,false,true,30,0, cgrates.org,Stat_3,FLTR_STAT_3,2014-07-29T15:00:00Z,100,1s,*acd;*tcd;*asr,,false,true,30,0, \ No newline at end of file diff --git a/data/tariffplans/testit/Suppliers.csv b/data/tariffplans/testit/Suppliers.csv index 7522d9042..0fb932afe 100644 --- a/data/tariffplans/testit/Suppliers.csv +++ b/data/tariffplans/testit/Suppliers.csv @@ -11,9 +11,12 @@ cgrates.org,SPL_LEASTCOST_1,,,,,supplier3,,,RP_SPECIAL_1002,,,15,,, cgrates.org,SPL_HIGHESTCOST_1,FLTR_SPP_2,2017-11-27T00:00:00Z,*highest_cost,,supplier1,,,RP_SPECIAL_1002,,,10,false,,10 cgrates.org,SPL_HIGHESTCOST_1,,,,,supplier2,,,RP_RETAIL1,,,20,,, cgrates.org,SPL_HIGHESTCOST_1,,,,,supplier3,,,RP_SPECIAL_1002,,,15,,, -cgrates.org,SPL_QOS_1,FLTR_SPP_3,2017-11-27T00:00:00Z,*qos,*acd;*tcd;*asr,supplier1,,,,,Stat_1,10,false,,10 +cgrates.org,SPL_QOS_1,FLTR_SPP_3,2017-11-27T00:00:00Z,*qos,*acd;*tcd;*asr,supplier1,,,,,Stat_1;Stat_1_1,10,false,,10 cgrates.org,SPL_QOS_1,,,,,supplier2,,,,,Stat_2,20,,, cgrates.org,SPL_QOS_1,,,,,supplier3,,,,,Stat_3,35,,, -cgrates.org,SPL_QOS_2,FLTR_SPP_4,2017-11-27T00:00:00Z,*qos,*pdd,supplier1,,,,,Stat_1,10,false,,10 +cgrates.org,SPL_QOS_2,FLTR_SPP_4,2017-11-27T00:00:00Z,*qos,*dcc,supplier1,,,,,Stat_1;Stat_1_1,10,false,,10 cgrates.org,SPL_QOS_2,,,,,supplier2,,,,,Stat_2,20,,, cgrates.org,SPL_QOS_2,,,,,supplier3,,,,,Stat_3,35,,, +cgrates.org,SPL_QOS_3,FLTR_SPP_5,2017-11-27T00:00:00Z,*qos,*pdd,supplier1,,,,,Stat_1;Stat_1_1,10,false,,10 +cgrates.org,SPL_QOS_3,,,,,supplier2,,,,,Stat_2,20,,, +cgrates.org,SPL_QOS_3,,,,,supplier3,,,,,Stat_3,35,,, diff --git a/engine/libsuppliers.go b/engine/libsuppliers.go index 47c9f2d4c..18013e64c 100644 --- a/engine/libsuppliers.go +++ b/engine/libsuppliers.go @@ -31,6 +31,7 @@ type SortedSupplier struct { SupplierID string SupplierParameters string SortingData map[string]interface{} // store here extra info like cost or stats + worstStats map[string]float64 } // SuppliersReply is returned as part of GetSuppliers call @@ -96,20 +97,20 @@ func (sSpls *SortedSuppliers) SortQOS(params []string) { sort.Slice(sSpls.SortedSuppliers, func(i, j int) bool { for _, param := range params { // skip to next param - if sSpls.SortedSuppliers[i].SortingData[param].(float64) == sSpls.SortedSuppliers[j].SortingData[param].(float64) { + if sSpls.SortedSuppliers[i].worstStats[param] == sSpls.SortedSuppliers[j].worstStats[param] { continue } - if sSpls.SortedSuppliers[i].SortingData[param].(float64) == -1 { + if sSpls.SortedSuppliers[i].worstStats[param] == -1 { return false } switch param { default: - return sSpls.SortedSuppliers[i].SortingData[param].(float64) > sSpls.SortedSuppliers[j].SortingData[param].(float64) + return sSpls.SortedSuppliers[i].worstStats[param] > sSpls.SortedSuppliers[j].worstStats[param] case utils.MetaPDD: - return sSpls.SortedSuppliers[i].SortingData[param].(float64) < sSpls.SortedSuppliers[j].SortingData[param].(float64) + return sSpls.SortedSuppliers[i].worstStats[param] < sSpls.SortedSuppliers[j].worstStats[param] } } - return sSpls.SortedSuppliers[i].SortingData[utils.Weight].(float64) > sSpls.SortedSuppliers[j].SortingData[utils.Weight].(float64) + return sSpls.SortedSuppliers[i].worstStats[utils.Weight] > sSpls.SortedSuppliers[j].worstStats[utils.Weight] }) } diff --git a/engine/libsuppliers_test.go b/engine/libsuppliers_test.go index e1d04426c..370b811f6 100644 --- a/engine/libsuppliers_test.go +++ b/engine/libsuppliers_test.go @@ -288,7 +288,7 @@ func TestLibSuppliersSortQOS(t *testing.T) { SortedSuppliers: []*SortedSupplier{ &SortedSupplier{ SupplierID: "supplier1", - SortingData: map[string]interface{}{ + worstStats: map[string]float64{ utils.MetaACD: 0.1, utils.MetaTCD: 15.0, }, @@ -296,7 +296,7 @@ func TestLibSuppliersSortQOS(t *testing.T) { }, &SortedSupplier{ SupplierID: "supplier2", - SortingData: map[string]interface{}{ + worstStats: map[string]float64{ utils.MetaACD: 0.2, utils.MetaTCD: 20.0, }, @@ -304,7 +304,7 @@ func TestLibSuppliersSortQOS(t *testing.T) { }, &SortedSupplier{ SupplierID: "supplier3", - SortingData: map[string]interface{}{ + worstStats: map[string]float64{ utils.MetaACD: 0.05, utils.MetaTCD: 10.0, }, @@ -317,7 +317,7 @@ func TestLibSuppliersSortQOS(t *testing.T) { SortedSuppliers: []*SortedSupplier{ &SortedSupplier{ SupplierID: "supplier2", - SortingData: map[string]interface{}{ + worstStats: map[string]float64{ utils.MetaACD: 0.2, utils.MetaTCD: 20.0, }, @@ -325,7 +325,7 @@ func TestLibSuppliersSortQOS(t *testing.T) { }, &SortedSupplier{ SupplierID: "supplier1", - SortingData: map[string]interface{}{ + worstStats: map[string]float64{ utils.MetaACD: 0.1, utils.MetaTCD: 15.0, }, @@ -333,7 +333,7 @@ func TestLibSuppliersSortQOS(t *testing.T) { }, &SortedSupplier{ SupplierID: "supplier3", - SortingData: map[string]interface{}{ + worstStats: map[string]float64{ utils.MetaACD: 0.05, utils.MetaTCD: 10.0, }, @@ -352,7 +352,7 @@ func TestLibSuppliersSortQOS2(t *testing.T) { SortedSuppliers: []*SortedSupplier{ &SortedSupplier{ SupplierID: "supplier1", - SortingData: map[string]interface{}{ + worstStats: map[string]float64{ utils.MetaACD: 0.2, utils.MetaTCD: 15.0, }, @@ -360,7 +360,7 @@ func TestLibSuppliersSortQOS2(t *testing.T) { }, &SortedSupplier{ SupplierID: "supplier2", - SortingData: map[string]interface{}{ + worstStats: map[string]float64{ utils.MetaACD: 0.2, utils.MetaTCD: 20.0, }, @@ -368,7 +368,7 @@ func TestLibSuppliersSortQOS2(t *testing.T) { }, &SortedSupplier{ SupplierID: "supplier3", - SortingData: map[string]interface{}{ + worstStats: map[string]float64{ utils.MetaACD: 0.1, utils.MetaTCD: 10.0, }, @@ -381,7 +381,7 @@ func TestLibSuppliersSortQOS2(t *testing.T) { SortedSuppliers: []*SortedSupplier{ &SortedSupplier{ SupplierID: "supplier2", - SortingData: map[string]interface{}{ + worstStats: map[string]float64{ utils.MetaACD: 0.2, utils.MetaTCD: 20.0, }, @@ -389,7 +389,7 @@ func TestLibSuppliersSortQOS2(t *testing.T) { }, &SortedSupplier{ SupplierID: "supplier1", - SortingData: map[string]interface{}{ + worstStats: map[string]float64{ utils.MetaACD: 0.2, utils.MetaTCD: 15.0, }, @@ -397,7 +397,7 @@ func TestLibSuppliersSortQOS2(t *testing.T) { }, &SortedSupplier{ SupplierID: "supplier3", - SortingData: map[string]interface{}{ + worstStats: map[string]float64{ utils.MetaACD: 0.1, utils.MetaTCD: 10.0, }, @@ -416,7 +416,7 @@ func TestLibSuppliersSortQOS3(t *testing.T) { SortedSuppliers: []*SortedSupplier{ &SortedSupplier{ SupplierID: "supplier1", - SortingData: map[string]interface{}{ + worstStats: map[string]float64{ utils.MetaACD: 0.2, utils.MetaTCD: 15.0, utils.MetaASR: 1.2, @@ -425,7 +425,7 @@ func TestLibSuppliersSortQOS3(t *testing.T) { }, &SortedSupplier{ SupplierID: "supplier2", - SortingData: map[string]interface{}{ + worstStats: map[string]float64{ utils.MetaACD: 0.2, utils.MetaTCD: 20.0, utils.MetaASR: -1.0, @@ -434,7 +434,7 @@ func TestLibSuppliersSortQOS3(t *testing.T) { }, &SortedSupplier{ SupplierID: "supplier3", - SortingData: map[string]interface{}{ + worstStats: map[string]float64{ utils.MetaACD: 0.1, utils.MetaTCD: 10.0, utils.MetaASR: 1.2, @@ -448,7 +448,7 @@ func TestLibSuppliersSortQOS3(t *testing.T) { SortedSuppliers: []*SortedSupplier{ &SortedSupplier{ SupplierID: "supplier1", - SortingData: map[string]interface{}{ + worstStats: map[string]float64{ utils.MetaACD: 0.2, utils.MetaTCD: 15.0, utils.MetaASR: 1.2, @@ -457,7 +457,7 @@ func TestLibSuppliersSortQOS3(t *testing.T) { }, &SortedSupplier{ SupplierID: "supplier3", - SortingData: map[string]interface{}{ + worstStats: map[string]float64{ utils.MetaACD: 0.1, utils.MetaTCD: 10.0, utils.MetaASR: 1.2, @@ -466,7 +466,7 @@ func TestLibSuppliersSortQOS3(t *testing.T) { }, &SortedSupplier{ SupplierID: "supplier2", - SortingData: map[string]interface{}{ + worstStats: map[string]float64{ utils.MetaACD: 0.2, utils.MetaTCD: 20.0, utils.MetaASR: -1.0, @@ -486,7 +486,7 @@ func TestLibSuppliersSortQOS4(t *testing.T) { SortedSuppliers: []*SortedSupplier{ &SortedSupplier{ SupplierID: "supplier1", - SortingData: map[string]interface{}{ + worstStats: map[string]float64{ utils.MetaACD: 0.2, utils.MetaTCD: 15.0, utils.MetaASR: -1.0, @@ -496,7 +496,7 @@ func TestLibSuppliersSortQOS4(t *testing.T) { }, &SortedSupplier{ SupplierID: "supplier2", - SortingData: map[string]interface{}{ + worstStats: map[string]float64{ utils.MetaACD: 0.2, utils.MetaTCD: 20.0, utils.MetaASR: 1.2, @@ -506,7 +506,7 @@ func TestLibSuppliersSortQOS4(t *testing.T) { }, &SortedSupplier{ SupplierID: "supplier3", - SortingData: map[string]interface{}{ + worstStats: map[string]float64{ utils.MetaACD: 0.1, utils.MetaTCD: 10.0, utils.MetaASR: 1.2, @@ -521,7 +521,7 @@ func TestLibSuppliersSortQOS4(t *testing.T) { SortedSuppliers: []*SortedSupplier{ &SortedSupplier{ SupplierID: "supplier2", - SortingData: map[string]interface{}{ + worstStats: map[string]float64{ utils.MetaACD: 0.2, utils.MetaTCD: 20.0, utils.MetaASR: 1.2, @@ -531,7 +531,7 @@ func TestLibSuppliersSortQOS4(t *testing.T) { }, &SortedSupplier{ SupplierID: "supplier3", - SortingData: map[string]interface{}{ + worstStats: map[string]float64{ utils.MetaACD: 0.1, utils.MetaTCD: 10.0, utils.MetaASR: 1.2, @@ -541,7 +541,7 @@ func TestLibSuppliersSortQOS4(t *testing.T) { }, &SortedSupplier{ SupplierID: "supplier1", - SortingData: map[string]interface{}{ + worstStats: map[string]float64{ utils.MetaACD: 0.2, utils.MetaTCD: 15.0, utils.MetaASR: -1.0, @@ -562,7 +562,7 @@ func TestLibSuppliersSortQOS5(t *testing.T) { SortedSuppliers: []*SortedSupplier{ &SortedSupplier{ SupplierID: "supplier1", - SortingData: map[string]interface{}{ + worstStats: map[string]float64{ utils.MetaACD: 0.2, utils.MetaPDD: 0.5, }, @@ -570,7 +570,7 @@ func TestLibSuppliersSortQOS5(t *testing.T) { }, &SortedSupplier{ SupplierID: "supplier2", - SortingData: map[string]interface{}{ + worstStats: map[string]float64{ utils.MetaACD: 0.2, utils.MetaPDD: 0.6, }, @@ -578,7 +578,7 @@ func TestLibSuppliersSortQOS5(t *testing.T) { }, &SortedSupplier{ SupplierID: "supplier3", - SortingData: map[string]interface{}{ + worstStats: map[string]float64{ utils.MetaACD: 0.1, utils.MetaPDD: 0.2, }, @@ -591,7 +591,7 @@ func TestLibSuppliersSortQOS5(t *testing.T) { SortedSuppliers: []*SortedSupplier{ &SortedSupplier{ SupplierID: "supplier3", - SortingData: map[string]interface{}{ + worstStats: map[string]float64{ utils.MetaACD: 0.1, utils.MetaPDD: 0.2, }, @@ -599,7 +599,7 @@ func TestLibSuppliersSortQOS5(t *testing.T) { }, &SortedSupplier{ SupplierID: "supplier1", - SortingData: map[string]interface{}{ + worstStats: map[string]float64{ utils.MetaACD: 0.2, utils.MetaPDD: 0.5, }, @@ -607,7 +607,7 @@ func TestLibSuppliersSortQOS5(t *testing.T) { }, &SortedSupplier{ SupplierID: "supplier2", - SortingData: map[string]interface{}{ + worstStats: map[string]float64{ utils.MetaACD: 0.2, utils.MetaPDD: 0.6, }, @@ -626,7 +626,7 @@ func TestLibSuppliersSortQOS6(t *testing.T) { SortedSuppliers: []*SortedSupplier{ &SortedSupplier{ SupplierID: "supplier1", - SortingData: map[string]interface{}{ + worstStats: map[string]float64{ utils.MetaACD: 0.2, utils.Weight: 15.0, }, @@ -634,7 +634,7 @@ func TestLibSuppliersSortQOS6(t *testing.T) { }, &SortedSupplier{ SupplierID: "supplier2", - SortingData: map[string]interface{}{ + worstStats: map[string]float64{ utils.MetaACD: 0.2, utils.Weight: 25.0, }, @@ -642,7 +642,7 @@ func TestLibSuppliersSortQOS6(t *testing.T) { }, &SortedSupplier{ SupplierID: "supplier3", - SortingData: map[string]interface{}{ + worstStats: map[string]float64{ utils.MetaACD: 0.1, utils.Weight: 20.0, }, @@ -655,7 +655,7 @@ func TestLibSuppliersSortQOS6(t *testing.T) { SortedSuppliers: []*SortedSupplier{ &SortedSupplier{ SupplierID: "supplier2", - SortingData: map[string]interface{}{ + worstStats: map[string]float64{ utils.MetaACD: 0.2, utils.Weight: 25.0, }, @@ -663,7 +663,7 @@ func TestLibSuppliersSortQOS6(t *testing.T) { }, &SortedSupplier{ SupplierID: "supplier1", - SortingData: map[string]interface{}{ + worstStats: map[string]float64{ utils.MetaACD: 0.2, utils.Weight: 15.0, }, @@ -672,7 +672,7 @@ func TestLibSuppliersSortQOS6(t *testing.T) { &SortedSupplier{ SupplierID: "supplier3", - SortingData: map[string]interface{}{ + worstStats: map[string]float64{ utils.MetaACD: 0.1, utils.Weight: 20.0, }, diff --git a/engine/spls_qos.go b/engine/spls_qos.go index a954c726a..6671c3a75 100755 --- a/engine/spls_qos.go +++ b/engine/spls_qos.go @@ -20,6 +20,7 @@ package engine import ( "fmt" + "strings" "github.com/cgrates/cgrates/utils" ) @@ -52,24 +53,44 @@ func (lcs *QOSSupplierSorter) SortSuppliers(prflID string, suppls []*Supplier, return nil, err } - srtData := map[string]interface{}{ + srtData := map[string]float64{ utils.Weight: s.Weight, } - - for k, v := range metricSupp { //transfer data from metric into srtData - srtData[k] = v - } - for _, metricParam := range extraOpts.sortingParameters { - if _, has := srtData[metricParam]; !has { - srtData[metricParam] = -1.0 + for _, metric := range extraOpts.sortingParameters { + hasMetric := false //check if metricSupp have sortingParameter + for keyWithID, value := range metricSupp { //transfer data from metric into srtData + if metric == strings.Split(keyWithID, utils.InInFieldSep)[0] { + if val, hasKey := srtData[metric]; !hasKey || + (metric == utils.MetaPDD && val < value) || //worst values + (metric != utils.MetaPDD && val > value) { + srtData[metric] = value + hasMetric = true + } + } + } + if hasMetric == false { //if not have populate with default value + if metric == utils.MetaPDD { + srtData[metric] = 1000000 + } else { + srtData[metric] = -1 + } } } + sortingData := map[string]interface{}{ + utils.Weight: s.Weight, + } + for k, v := range metricSupp { + sortingData[k] = v + } sortedSuppls.SortedSuppliers = append(sortedSuppls.SortedSuppliers, &SortedSupplier{ SupplierID: s.ID, - SortingData: srtData, - SupplierParameters: s.SupplierParameters}) + SortingData: sortingData, + SupplierParameters: s.SupplierParameters, + worstStats: srtData, + }, + ) } if len(sortedSuppls.SortedSuppliers) == 0 { return nil, utils.ErrNotFound diff --git a/engine/suppliers.go b/engine/suppliers.go index 119c07e08..884f1efcb 100644 --- a/engine/suppliers.go +++ b/engine/suppliers.go @@ -271,8 +271,9 @@ func (spS *SupplierService) statMetrics(statIDs []string, tenant string) (stsMet fmt.Sprintf(" error: %s getting statMetrics for stat : %s", err.Error(), statID)) } for key, val := range metrics { - stsMetric[key] = val + stsMetric[utils.ConcatenatedKey(key, statID)] = val } + } } return