mirror of
https://github.com/cgrates/cgrates.git
synced 2026-02-16 05:39:54 +05:00
Update QOS strategy to show metric:StatID:value
This commit is contained in:
committed by
Dan Christian Bogos
parent
c441c7496a
commit
f70b9a11f1
@@ -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{
|
||||
|
||||
@@ -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,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,
|
||||
|
@@ -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,,,
|
||||
|
||||
|
@@ -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]
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
@@ -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,
|
||||
},
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user