Update QOS strategy to show metric:StatID:value

This commit is contained in:
TeoV
2018-07-30 07:42:10 -04:00
committed by Dan Christian Bogos
parent c441c7496a
commit f70b9a11f1
8 changed files with 193 additions and 84 deletions

View File

@@ -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{

View File

@@ -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
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
1 #Tenant[0] ID[1] FilterType[2] FilterFieldName[3] FilterFieldValues[4] ActivationInterval[5]
14 cgrates.org FLTR_STAT_1 *string Account 1001 2014-07-29T15:00:00Z
15 cgrates.org FLTR_STAT_2 *string Account 1002 2014-07-29T15:00:00Z
16 cgrates.org FLTR_STAT_3 *string Account 1003 2014-07-29T15:00:00Z
17 cgrates.org FLTR_SPP_4 *string DistincMatch *qos2 2014-07-29T15:00:00Z
18 cgrates.org FLTR_SPP_5 *string DistincMatch *qos3 2014-07-29T15:00:00Z
19 cgrates.org FLTR_STAT_1_1 *string Stat Stat1_1 2014-07-29T15:00:00Z

View File

@@ -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,
1 #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]
2 cgrates.org Stat_1 FLTR_STAT_1 2014-07-29T15:00:00Z 100 1s *acd;*tcd;*asr false true 30 0
3 cgrates.org Stat_1_1 FLTR_STAT_1_1 2014-07-29T15:00:00Z 100 1s *acd;*tcd;*pdd false true 30 0
4 cgrates.org Stat_2 FLTR_STAT_2 2014-07-29T15:00:00Z 100 1s *acd;*tcd;*asr false true 30 0
5 cgrates.org Stat_3 FLTR_STAT_3 2014-07-29T15:00:00Z 100 1s *acd;*tcd;*asr false true 30 0

View File

@@ -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,,,
1 #Tenant ID FilterIDs ActivationInterval Sorting SortingParameters SupplierID SupplierFilterIDs SupplierAccountIDs SupplierRatingPlanIDs SupplierResourceIDs SupplierStatIDs SupplierWeight SupplierBlocker SupplierParameters Weight
11 cgrates.org SPL_HIGHESTCOST_1 FLTR_SPP_2 2017-11-27T00:00:00Z *highest_cost supplier1 RP_SPECIAL_1002 10 false 10
12 cgrates.org SPL_HIGHESTCOST_1 supplier2 RP_RETAIL1 20
13 cgrates.org SPL_HIGHESTCOST_1 supplier3 RP_SPECIAL_1002 15
14 cgrates.org SPL_QOS_1 FLTR_SPP_3 2017-11-27T00:00:00Z *qos *acd;*tcd;*asr supplier1 Stat_1 Stat_1;Stat_1_1 10 false 10
15 cgrates.org SPL_QOS_1 supplier2 Stat_2 20
16 cgrates.org SPL_QOS_1 supplier3 Stat_3 35
17 cgrates.org SPL_QOS_2 FLTR_SPP_4 2017-11-27T00:00:00Z *qos *pdd *dcc supplier1 Stat_1 Stat_1;Stat_1_1 10 false 10
18 cgrates.org SPL_QOS_2 supplier2 Stat_2 20
19 cgrates.org SPL_QOS_2 supplier3 Stat_3 35
20 cgrates.org SPL_QOS_3 FLTR_SPP_5 2017-11-27T00:00:00Z *qos *pdd supplier1 Stat_1;Stat_1_1 10 false 10
21 cgrates.org SPL_QOS_3 supplier2 Stat_2 20
22 cgrates.org SPL_QOS_3 supplier3 Stat_3 35

View File

@@ -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]
})
}

View File

@@ -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,
},

View File

@@ -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

View File

@@ -271,8 +271,9 @@ func (spS *SupplierService) statMetrics(statIDs []string, tenant string) (stsMet
fmt.Sprintf("<SupplierS> 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