Reordering ActionTriggers.csv for eficiency purposes

This commit is contained in:
DanB
2014-09-22 13:28:14 +02:00
parent fd84f0e90e
commit e197cef030
9 changed files with 144 additions and 141 deletions

View File

@@ -1,6 +1,6 @@
#Tag,BalanceTag,Direction,ThresholdType,ThresholdValue,Recurrent,MinSleep,BalanceDestinationTag,BalanceWeight,BalanceExpiryTime,BalanceRatingSubject,BalanceCategory,BalanceSharedGroup,StatsMinQueuedItems,ActionsTag,Weight
CDRST3_WARN_ASR,,,*min_asr,45,true,1h,,,,,,,3,CDRST_LOG,10
CDRST3_WARN_ACD,,,*min_acd,10,true,1h,,,,,,,5,CDRST_LOG,10
CDRST3_WARN_ACC,,,*max_acc,10,true,10m,,,,,,,5,CDRST_LOG,10
CDRST4_WARN_ASR,,,*min_asr,30,true,0,,,,,,,5,CDRST_LOG,10
CDRST4_WARN_ACD,,,*min_acd,3,true,0,,,,,,,2,CDRST_LOG,10
#Tag[0],ThresholdType[1],ThresholdValue[2],Recurrent[3],MinSleep[4],BalanceType[5],BalanceDirection[6],BalanceCategory[7],BalanceDestinationTag[8],BalanceRatingSubject[9],BalanceSharedGroup[10],BalanceExpiryTime[11],BalanceWeight[12],StatsMinQueuedItems[13],ActionsTag[14],Weight[15]
CDRST3_WARN_ASR,*min_asr,45,true,1h,,,,,,,,,3,CDRST_LOG,10
CDRST3_WARN_ACD,*min_acd,10,true,1h,,,,,,,,,5,CDRST_LOG,10
CDRST3_WARN_ACC,*max_acc,10,true,10m,,,,,,,,,5,CDRST_LOG,10
CDRST4_WARN_ASR,*min_asr,30,true,0,,,,,,,,,5,CDRST_LOG,10
CDRST4_WARN_ACD,*min_acd,3,true,0,,,,,,,,,2,CDRST_LOG,10
1 #Tag #Tag[0] BalanceTag ThresholdType[1] Direction ThresholdValue[2] ThresholdType Recurrent[3] ThresholdValue MinSleep[4] Recurrent BalanceType[5] MinSleep BalanceDirection[6] BalanceDestinationTag BalanceCategory[7] BalanceWeight BalanceDestinationTag[8] BalanceExpiryTime BalanceRatingSubject[9] BalanceRatingSubject BalanceSharedGroup[10] BalanceCategory BalanceExpiryTime[11] BalanceSharedGroup BalanceWeight[12] StatsMinQueuedItems StatsMinQueuedItems[13] ActionsTag ActionsTag[14] Weight Weight[15]
2 CDRST3_WARN_ASR CDRST3_WARN_ASR *min_asr 45 *min_asr true 45 1h true 1h 3 3 CDRST_LOG CDRST_LOG 10 10
3 CDRST3_WARN_ACD CDRST3_WARN_ACD *min_acd 10 *min_acd true 10 1h true 1h 5 5 CDRST_LOG CDRST_LOG 10 10
4 CDRST3_WARN_ACC CDRST3_WARN_ACC *max_acc 10 *max_acc true 10 10m true 10m 5 5 CDRST_LOG CDRST_LOG 10 10
5 CDRST4_WARN_ASR CDRST4_WARN_ASR *min_asr 30 *min_asr true 30 0 true 0 5 5 CDRST_LOG CDRST_LOG 10 10
6 CDRST4_WARN_ACD CDRST4_WARN_ACD *min_acd 3 *min_acd true 3 0 true 0 2 2 CDRST_LOG CDRST_LOG 10 10

View File

@@ -1,9 +1,9 @@
#Tag,BalanceTag,Direction,ThresholdType,ThresholdValue,Recurrent,MinSleep,BalanceDestinationTag,BalanceWeight,BalanceExpiryTime,BalanceRatingSubject,BalanceCategory,BalanceSharedGroup,StatsMinQueuedItems,ActionsTag,Weight
STANDARD_TRIGGERS,*monetary,*out,*min_balance,2,false,0,,,,,,,,LOG_BALANCE,10
STANDARD_TRIGGERS,*monetary,*out,*max_balance,20,false,0,,,,,,,,LOG_BALANCE,10
STANDARD_TRIGGERS,*monetary,*out,*max_counter,15,false,0,FS_USERS,,,,,,,LOG_BALANCE,10
CDRST1_WARN_ASR,,,*min_asr,45,true,1h,,,,,,,3,CDRST_WARN_HTTP,10
CDRST1_WARN_ACD,,,*min_acd,10,true,1h,,,,,,,5,CDRST_WARN_HTTP,10
CDRST1_WARN_ACC,,,*max_acc,10,true,10m,,,,,,,5,CDRST_WARN_HTTP,10
CDRST2_WARN_ASR,,,*min_asr,30,true,0,,,,,,,5,CDRST_WARN_HTTP,10
CDRST2_WARN_ACD,,,*min_acd,3,true,0,,,,,,,2,CDRST_LOG,10
#Tag[0],ThresholdType[1],ThresholdValue[2],Recurrent[3],MinSleep[4],BalanceType[5],BalanceDirection[6],BalanceCategory[7],BalanceDestinationTag[8],BalanceRatingSubject[9],BalanceSharedGroup[10],BalanceExpiryTime[11],BalanceWeight[12],StatsMinQueuedItems[13],ActionsTag[14],Weight[15]
STANDARD_TRIGGERS,*min_balance,2,false,0,*monetary,*out,,,,,,,,LOG_BALANCE,10
STANDARD_TRIGGERS,*max_balance,20,false,0,*monetary,*out,,,,,,,,LOG_BALANCE,10
STANDARD_TRIGGERS,*max_counter,15,false,0,*monetary,*out,,FS_USERS,,,,,,LOG_BALANCE,10
CDRST1_WARN_ASR,*min_asr,45,true,1h,,,,,,,,,3,CDRST_WARN_HTTP,10
CDRST1_WARN_ACD,*min_acd,10,true,1h,,,,,,,,,5,CDRST_WARN_HTTP,10
CDRST1_WARN_ACC,*max_acc,10,true,10m,,,,,,,,,5,CDRST_WARN_HTTP,10
CDRST2_WARN_ASR,*min_asr,30,true,0,,,,,,,,,5,CDRST_WARN_HTTP,10
CDRST2_WARN_ACD,*min_acd,3,true,0,,,,,,,,,2,CDRST_LOG,10
1 #Tag #Tag[0] ThresholdType ThresholdType[1] ThresholdValue ThresholdValue[2] Recurrent Recurrent[3] MinSleep MinSleep[4] BalanceTag BalanceType[5] Direction BalanceDirection[6] BalanceWeight BalanceCategory[7] BalanceDestinationTag BalanceDestinationTag[8] BalanceExpiryTime BalanceRatingSubject[9] BalanceRatingSubject BalanceSharedGroup[10] BalanceCategory BalanceExpiryTime[11] BalanceSharedGroup BalanceWeight[12] StatsMinQueuedItems StatsMinQueuedItems[13] ActionsTag ActionsTag[14] Weight Weight[15]
2 STANDARD_TRIGGERS *min_balance 2 false 0 *monetary *out LOG_BALANCE 10
3 STANDARD_TRIGGERS *max_balance 20 false 0 *monetary *out LOG_BALANCE 10
4 STANDARD_TRIGGERS *max_counter 15 false 0 *monetary *out FS_USERS LOG_BALANCE 10
5 CDRST1_WARN_ASR *min_asr 45 true 1h 3 CDRST_WARN_HTTP 10
6 CDRST1_WARN_ACD *min_acd 10 true 1h 5 CDRST_WARN_HTTP 10
7 CDRST1_WARN_ACC *max_acc 10 true 10m 5 CDRST_WARN_HTTP 10
8 CDRST2_WARN_ASR *min_asr 30 true 0 5 CDRST_WARN_HTTP 10
9 CDRST2_WARN_ACD *min_acd 3 true 0 2 CDRST_LOG 10

View File

@@ -1,13 +1,12 @@
#Tag,BalanceTag,Direction,ThresholdType,ThresholdValue,Recurrent,MinSleep,BalanceDestinationTag,BalanceWeight,BalanceExpiryTime,BalanceRatingSubject,BalanceCategory,BalanceSharedGroup,StatsMinQueuedItems,ActionsTag,Weight
##Tag,BalanceTag,Direction,ThresholdType,ThresholdValue,Recurrent,MinSleep,BalanceCategory,BalanceRatingSubject,BalanceDestinationTag,BalanceExpiryTime,BalanceSharedGroup,BalanceWeight,StatsMinQueuedItems,ActionsTag,Weight
STANDARD_TRIGGERS,*monetary,*out,*min_balance,2,false,0,,,,,,,,LOG_WARNING,10
STANDARD_TRIGGERS,*monetary,*out,*max_counter,5,false,0,FS_USERS,,,,,,,LOG_WARNING,10
STANDARD_TRIGGERS,*monetary,*out,*max_balance,20,false,0,,,,,,,,LOG_WARNING,10
STANDARD_TRIGGERS,*monetary,*out,*max_balance,100,false,0,,,,,,,,DISABLE_AND_LOG,10
CDRST1_WARN,,,*min_asr,45,true,1m,,,,,,,3,LOG_WARNING,10
CDRST1_WARN,,,*min_acd,10,true,1m,,,,,,,5,LOG_WARNING,10
CDRST1_WARN,,,*max_acc,10,true,1m,,,,,,,5,LOG_WARNING,10
CDRST1001_WARN,,,*min_asr,65,true,1m,,,,,,,3,LOG_WARNING,10
CDRST1001_WARN,,,*min_acd,10,true,1m,,,,,,,5,LOG_WARNING,10
CDRST1001_WARN,,,*max_acc,5,true,1m,,,,,,,5,LOG_WARNING,10
CDRST3_WARN,,,*min_acd,60,false,1m,,,,,,,5,LOG_WARNING,10
#Tag[0],ThresholdType[1],ThresholdValue[2],Recurrent[3],MinSleep[4],BalanceType[5],BalanceDirection[6],BalanceCategory[7],BalanceDestinationTag[8],BalanceRatingSubject[9],BalanceSharedGroup[10],BalanceExpiryTime[11],BalanceWeight[12],StatsMinQueuedItems[13],ActionsTag[14],Weight[15]
STANDARD_TRIGGERS,*min_balance,2,false,0,*monetary,*out,,,,,,,,LOG_WARNING,10
STANDARD_TRIGGERS,*max_counter,5,false,0,*monetary,*out,,FS_USERS,,,,,,LOG_WARNING,10
STANDARD_TRIGGERS,*max_balance,20,false,0,*monetary,*out,,,,,,,,LOG_WARNING,10
STANDARD_TRIGGERS,*max_balance,100,false,0,*monetary,*out,,,,,,,,DISABLE_AND_LOG,10
CDRST1_WARN,*min_asr,45,true,1m,,,,,,,,,3,LOG_WARNING,10
CDRST1_WARN,*min_acd,10,true,1m,,,,,,,,,5,LOG_WARNING,10
CDRST1_WARN,*max_acc,10,true,1m,,,,,,,,,5,LOG_WARNING,10
CDRST1001_WARN,*min_asr,65,true,1m,,,,,,,,,3,LOG_WARNING,10
CDRST1001_WARN,*min_acd,10,true,1m,,,,,,,,,5,LOG_WARNING,10
CDRST1001_WARN,*max_acc,5,true,1m,,,,,,,,,5,LOG_WARNING,10
CDRST3_WARN,*min_acd,60,false,1m,,,,,,,,,5,LOG_WARNING,10
1 #Tag #Tag[0] BalanceTag ThresholdType[1] Direction ThresholdValue[2] ThresholdType Recurrent[3] ThresholdValue MinSleep[4] Recurrent BalanceType[5] MinSleep BalanceDirection[6] BalanceDestinationTag BalanceWeight BalanceCategory[7] BalanceDestinationTag[8] BalanceExpiryTime BalanceRatingSubject[9] BalanceRatingSubject BalanceSharedGroup[10] BalanceCategory BalanceExpiryTime[11] BalanceSharedGroup BalanceWeight[12] StatsMinQueuedItems StatsMinQueuedItems[13] ActionsTag ActionsTag[14] Weight Weight[15]
2 ##Tag STANDARD_TRIGGERS BalanceTag *min_balance Direction 2 ThresholdType false ThresholdValue 0 Recurrent *monetary MinSleep *out BalanceCategory BalanceRatingSubject BalanceDestinationTag BalanceExpiryTime BalanceSharedGroup BalanceWeight StatsMinQueuedItems ActionsTag LOG_WARNING Weight 10
3 STANDARD_TRIGGERS STANDARD_TRIGGERS *monetary *max_counter *out 5 *min_balance false 2 0 false *monetary 0 *out FS_USERS LOG_WARNING LOG_WARNING 10
4 STANDARD_TRIGGERS STANDARD_TRIGGERS *monetary *max_balance *out 20 *max_counter false 5 0 false *monetary 0 *out FS_USERS LOG_WARNING LOG_WARNING 10
5 STANDARD_TRIGGERS STANDARD_TRIGGERS *monetary *max_balance *out 100 *max_balance false 20 0 false *monetary 0 *out LOG_WARNING DISABLE_AND_LOG 10
6 STANDARD_TRIGGERS CDRST1_WARN *monetary *min_asr *out 45 *max_balance true 100 1m false 0 3 DISABLE_AND_LOG LOG_WARNING 10
7 CDRST1_WARN CDRST1_WARN *min_acd 10 *min_asr true 45 1m true 1m 3 5 LOG_WARNING LOG_WARNING 10
8 CDRST1_WARN CDRST1_WARN *max_acc 10 *min_acd true 10 1m true 1m 5 5 LOG_WARNING LOG_WARNING 10
9 CDRST1_WARN CDRST1001_WARN *min_asr 65 *max_acc true 10 1m true 1m 5 3 LOG_WARNING LOG_WARNING 10
10 CDRST1001_WARN CDRST1001_WARN *min_acd 10 *min_asr true 65 1m true 1m 3 5 LOG_WARNING LOG_WARNING 10
11 CDRST1001_WARN CDRST1001_WARN *max_acc 5 *min_acd true 10 1m true 1m 5 5 LOG_WARNING LOG_WARNING 10
12 CDRST1001_WARN CDRST3_WARN *min_acd 60 *max_acc false 5 1m true 1m 5 5 LOG_WARNING LOG_WARNING 10
CDRST3_WARN *min_acd 60 false 1m 5 LOG_WARNING 10

View File

@@ -654,47 +654,46 @@ func (csvr *CSVReader) LoadActions() (err error) {
if fp != nil {
defer fp.Close()
}
fieldIndex := CSV_FIELD_INDEX[utils.ACTIONS_CSV]
for record, err := csvReader.Read(); err == nil; record, err = csvReader.Read() {
tag := record[fieldIndex[utils.CSVFLD_ACTIONS_TAG]]
tag := record[ACTSCSVIDX_TAG]
var units float64
if len(record[fieldIndex[utils.CSVFLD_UNITS]]) == 0 { // Not defined
if len(record[ACTSCSVIDX_UNITS]) == 0 { // Not defined
units = 0.0
} else {
units, err = strconv.ParseFloat(record[fieldIndex[utils.CSVFLD_UNITS]], 64)
units, err = strconv.ParseFloat(record[ACTSCSVIDX_UNITS], 64)
if err != nil {
return fmt.Errorf("Could not parse action units: %v", err)
}
}
var balanceWeight float64
if len(record[fieldIndex[utils.CSVFLD_BALANCE_WEIGHT]]) == 0 { // Not defined
if len(record[ACTSCSVIDX_BALANCE_WEIGHT]) == 0 { // Not defined
balanceWeight = 0.0
} else {
balanceWeight, err = strconv.ParseFloat(record[fieldIndex[utils.CSVFLD_BALANCE_WEIGHT]], 64)
balanceWeight, err = strconv.ParseFloat(record[ACTSCSVIDX_BALANCE_WEIGHT], 64)
if err != nil {
return fmt.Errorf("Could not parse action balance weight: %v", err)
}
}
weight, err := strconv.ParseFloat(record[fieldIndex[utils.CSVFLD_WEIGHT]], 64)
weight, err := strconv.ParseFloat(record[ACTSCSVIDX_WEIGHT], 64)
if err != nil {
return fmt.Errorf("Could not parse action weight: %v", err)
}
a := &Action{
Id: utils.GenUUID(),
ActionType: record[fieldIndex[utils.CSVFLD_ACTION]],
BalanceType: record[fieldIndex[utils.CSVFLD_BALANCE_TYPE]],
Direction: record[fieldIndex[utils.CSVFLD_DIRECTION]],
ActionType: record[ACTSCSVIDX_ACTION],
BalanceType: record[ACTSCSVIDX_BALANCE_TYPE],
Direction: record[ACTSCSVIDX_DIRECTION],
Weight: weight,
ExpirationString: record[fieldIndex[utils.CSVFLD_EXPIRY_TIME]],
ExtraParameters: record[fieldIndex[utils.CSVFLD_EXTRA_PARAMS]],
ExpirationString: record[ACTSCSVIDX_EXPIRY_TIME],
ExtraParameters: record[ACTSCSVIDX_EXTRA_PARAMS],
Balance: &Balance{
Uuid: utils.GenUUID(),
Value: units,
Weight: balanceWeight,
DestinationId: record[fieldIndex[utils.CSVFLD_DESTINATION_TAG]],
RatingSubject: record[fieldIndex[utils.CSVFLD_RATING_SUBJECT]],
Category: record[fieldIndex[utils.CSVFLD_CATEGORY]],
SharedGroup: record[fieldIndex[utils.CSVFLD_SHARED_GROUP]],
DestinationId: record[ACTSCSVIDX_DESTINATION_TAG],
RatingSubject: record[ACTSCSVIDX_RATING_SUBJECT],
Category: record[ACTSCSVIDX_CATEGORY],
SharedGroup: record[ACTSCSVIDX_SHARED_GROUP],
},
}
if _, err := utils.ParseDate(a.ExpirationString); err != nil {
@@ -760,57 +759,57 @@ func (csvr *CSVReader) LoadActionTriggers() (err error) {
defer fp.Close()
}
for record, err := csvReader.Read(); err == nil; record, err = csvReader.Read() {
tag := record[0]
value, err := strconv.ParseFloat(record[4], 64)
tag := record[ATRIGCSVIDX_TAG]
value, err := strconv.ParseFloat(record[ATRIGCSVIDX_THRESHOLD_VALUE], 64)
if err != nil {
return fmt.Errorf("Could not parse action trigger value (%v): %v", record[4], err)
return fmt.Errorf("Could not parse action trigger threshold value (%v): %v", record[ATRIGCSVIDX_THRESHOLD_VALUE], err)
}
recurrent, err := strconv.ParseBool(record[5])
recurrent, err := strconv.ParseBool(record[ATRIGCSVIDX_RECURRENT])
if err != nil {
return fmt.Errorf("Could not parse action trigger recurrent flag (%v): %v", record[5], err)
return fmt.Errorf("Could not parse action trigger recurrent flag (%v): %v", record[ATRIGCSVIDX_RECURRENT], err)
}
minSleep, err := time.ParseDuration(record[6])
minSleep, err := time.ParseDuration(record[ATRIGCSVIDX_MIN_SLEEP])
if err != nil {
if record[6] == "" {
if record[ATRIGCSVIDX_MIN_SLEEP] == "" {
minSleep = 0
} else {
return fmt.Errorf("Could not parse action trigger MinSleep (%v): %v", record[6], err)
return fmt.Errorf("Could not parse action trigger MinSleep (%v): %v", record[ATRIGCSVIDX_MIN_SLEEP], err)
}
}
balanceWeight, err := strconv.ParseFloat(record[8], 64)
if record[8] != "" && err != nil {
return fmt.Errorf("Could not parse action trigger BalanceWeight (%v): %v", record[8], err)
balanceWeight, err := strconv.ParseFloat(record[ATRIGCSVIDX_BAL_WEIGHT], 64)
if record[ATRIGCSVIDX_BAL_WEIGHT] != "" && err != nil {
return fmt.Errorf("Could not parse action trigger BalanceWeight (%v): %v", record[ATRIGCSVIDX_BAL_WEIGHT], err)
}
balanceExp, err := utils.ParseTimeDetectLayout(record[9])
if record[9] != "" && err != nil {
return fmt.Errorf("Could not parse action trigger BalanceExpirationDate (%v): %v", record[9], err)
balanceExp, err := utils.ParseTimeDetectLayout(record[ATRIGCSVIDX_BAL_EXPIRY_TIME])
if record[ATRIGCSVIDX_BAL_EXPIRY_TIME] != "" && err != nil {
return fmt.Errorf("Could not parse action trigger BalanceExpirationDate (%v): %v", record[ATRIGCSVIDX_BAL_EXPIRY_TIME], err)
}
minQI, err := strconv.Atoi(record[13])
if record[13] != "" && err != nil {
return fmt.Errorf("Could not parse action trigger MinQueuedItems (%v): %v", record[13], err)
minQI, err := strconv.Atoi(record[ATRIGCSVIDX_STATS_MIN_QUEUED_ITEMS])
if record[ATRIGCSVIDX_STATS_MIN_QUEUED_ITEMS] != "" && err != nil {
return fmt.Errorf("Could not parse action trigger MinQueuedItems (%v): %v", record[ATRIGCSVIDX_STATS_MIN_QUEUED_ITEMS], err)
}
weight, err := strconv.ParseFloat(record[15], 64)
weight, err := strconv.ParseFloat(record[ATRIGCSVIDX_WEIGHT], 64)
if err != nil {
return fmt.Errorf("Could not parse action trigger weight (%v): %v", record[15], err)
return fmt.Errorf("Could not parse action trigger weight (%v): %v", record[ATRIGCSVIDX_WEIGHT], err)
}
at := &ActionTrigger{
Id: utils.GenUUID(),
BalanceType: record[1],
Direction: record[2],
ThresholdType: record[3],
BalanceType: record[ATRIGCSVIDX_BAL_TYPE],
Direction: record[ATRIGCSVIDX_BAL_DIRECTION],
ThresholdType: record[ATRIGCSVIDX_THRESHOLD_TYPE],
ThresholdValue: value,
Recurrent: recurrent,
MinSleep: minSleep,
DestinationId: record[7],
DestinationId: record[ATRIGCSVIDX_BAL_DESTINATION_TAG],
BalanceWeight: balanceWeight,
BalanceExpirationDate: balanceExp,
BalanceRatingSubject: record[10],
BalanceCategory: record[11],
BalanceSharedGroup: record[12],
BalanceRatingSubject: record[ATRIGCSVIDX_BAL_RATING_SUBJECT],
BalanceCategory: record[ATRIGCSVIDX_BAL_CATEGORY],
BalanceSharedGroup: record[ATRIGCSVIDX_BAL_SHARED_GROUP],
MinQueuedItems: minQI,
ActionsId: record[14],
ActionsId: record[ATRIGCSVIDX_ACTIONS_TAG],
Weight: weight,
}
csvr.actionsTriggers[tag] = append(csvr.actionsTriggers[tag], at)

View File

@@ -160,17 +160,18 @@ TOPUP_SHARED0_AT,SE0,ASAP,10
TOPUP_SHARED10_AT,SE10,ASAP,10
TOPUP_EMPTY_AT,EE0,ASAP,10
`
actionTriggers = `
STANDARD_TRIGGER,*voice,*out,*min_counter,10,false,0,GERMANY_O2,,,,,,,SOME_1,10
STANDARD_TRIGGER,*voice,*out,*max_balance,200,false,0,GERMANY,,,,,,,SOME_2,10
STANDARD_TRIGGERS,*monetary,*out,*min_balance,2,false,0,,,,,,,,LOG_WARNING,10
STANDARD_TRIGGERS,*monetary,*out,*max_balance,20,false,0,,,,,,,,LOG_WARNING,10
STANDARD_TRIGGERS,*monetary,*out,*max_counter,5,false,0,FS_USERS,,,,,,,LOG_WARNING,10
CDRST1_WARN_ASR,,,*min_asr,45,true,1h,,,,,,,3,CDRST_WARN_HTTP,10
CDRST1_WARN_ACD,,,*min_acd,10,true,1h,,,,,,,5,CDRST_WARN_HTTP,10
CDRST1_WARN_ACC,,,*max_acc,10,true,10m,,,,,,,5,CDRST_WARN_HTTP,10
CDRST2_WARN_ASR,,,*min_asr,30,true,0,,,,,,,5,CDRST_WARN_HTTP,10
CDRST2_WARN_ACD,,,*min_acd,3,true,0,,,,,,,5,CDRST_WARN_HTTP,10
STANDARD_TRIGGER,*min_counter,10,false,0,*voice,*out,,GERMANY_O2,,,,,,SOME_1,10
STANDARD_TRIGGER,*max_balance,200,false,0,*voice,*out,,GERMANY,,,,,,SOME_2,10
STANDARD_TRIGGERS,*min_balance,2,false,0,*monetary,*out,,,,,,,,LOG_WARNING,10
STANDARD_TRIGGERS,*max_balance,20,false,0,*monetary,*out,,,,,,,,LOG_WARNING,10
STANDARD_TRIGGERS,*max_counter,5,false,0,*monetary,*out,,FS_USERS,,,,,,LOG_WARNING,10
CDRST1_WARN_ASR,*min_asr,45,true,1h,,,,,,,,,3,CDRST_WARN_HTTP,10
CDRST1_WARN_ACD,*min_acd,10,true,1h,,,,,,,,,5,CDRST_WARN_HTTP,10
CDRST1_WARN_ACC,*max_acc,10,true,10m,,,,,,,,,5,CDRST_WARN_HTTP,10
CDRST2_WARN_ASR,*min_asr,30,true,0,,,,,,,,,5,CDRST_WARN_HTTP,10
CDRST2_WARN_ACD,*min_acd,3,true,0,,,,,,,,,5,CDRST_WARN_HTTP,10
`
accountActions = `
vdf,minitsboy;a1;a2,*out,MORE_MINUTES,STANDARD_TRIGGER

View File

@@ -34,6 +34,43 @@ import (
"github.com/cgrates/cgrates/utils"
)
// Define here fields within utils.ACTIONS_CSV file
const (
ACTSCSVIDX_TAG = iota
ACTSCSVIDX_ACTION
ACTSCSVIDX_EXTRA_PARAMS
ACTSCSVIDX_BALANCE_TYPE
ACTSCSVIDX_DIRECTION
ACTSCSVIDX_CATEGORY
ACTSCSVIDX_DESTINATION_TAG
ACTSCSVIDX_RATING_SUBJECT
ACTSCSVIDX_SHARED_GROUP
ACTSCSVIDX_EXPIRY_TIME
ACTSCSVIDX_UNITS
ACTSCSVIDX_BALANCE_WEIGHT
ACTSCSVIDX_WEIGHT
)
// Define here fields within utils.ACTION_TRIGGERS_CSV file
const (
ATRIGCSVIDX_TAG = iota
ATRIGCSVIDX_THRESHOLD_TYPE
ATRIGCSVIDX_THRESHOLD_VALUE
ATRIGCSVIDX_RECURRENT
ATRIGCSVIDX_MIN_SLEEP
ATRIGCSVIDX_BAL_TYPE
ATRIGCSVIDX_BAL_DIRECTION
ATRIGCSVIDX_BAL_CATEGORY
ATRIGCSVIDX_BAL_DESTINATION_TAG
ATRIGCSVIDX_BAL_RATING_SUBJECT
ATRIGCSVIDX_BAL_SHARED_GROUP
ATRIGCSVIDX_BAL_EXPIRY_TIME
ATRIGCSVIDX_BAL_WEIGHT
ATRIGCSVIDX_STATS_MIN_QUEUED_ITEMS
ATRIGCSVIDX_ACTIONS_TAG
ATRIGCSVIDX_WEIGHT
)
type TPLoader interface {
LoadDestinations() error
LoadRates() error
@@ -97,7 +134,6 @@ func NewTiming(timingInfo ...string) (rt *utils.TPTiming) {
}
func UpdateCdrStats(cs *CdrStats, triggers ActionTriggerPriotityList, tpCs *utils.TPCdrStat) {
if tpCs.QueueLength != "" {
if qi, err := strconv.Atoi(tpCs.QueueLength); err == nil {
cs.QueueLength = qi
@@ -312,26 +348,6 @@ type FileLineRegexValidator struct {
Message string // Pass this message as helper
}
// Keep here the index reference for all the files, so we can use it as base for both loader and importer
//ToDo: Add the rest of the files
var CSV_FIELD_INDEX = map[string]map[string]int{
utils.ACTIONS_CSV: map[string]int{
utils.CSVFLD_ACTIONS_TAG: 0,
utils.CSVFLD_ACTION: 1,
utils.CSVFLD_EXTRA_PARAMS: 2,
utils.CSVFLD_BALANCE_TYPE: 3,
utils.CSVFLD_DIRECTION: 4,
utils.CSVFLD_CATEGORY: 5,
utils.CSVFLD_DESTINATION_TAG: 6,
utils.CSVFLD_RATING_SUBJECT: 7,
utils.CSVFLD_SHARED_GROUP: 8,
utils.CSVFLD_EXPIRY_TIME: 9,
utils.CSVFLD_UNITS: 10,
utils.CSVFLD_BALANCE_WEIGHT: 11,
utils.CSVFLD_WEIGHT: 12,
},
}
var FileValidators = map[string]*FileLineRegexValidator{
utils.DESTINATIONS_CSV: &FileLineRegexValidator{utils.DESTINATIONS_NRCOLS,
regexp.MustCompile(`(?:\w+\s*,\s*){1}(?:\+?\d+.?\d*){1}$`),
@@ -360,8 +376,8 @@ var FileValidators = map[string]*FileLineRegexValidator{
utils.ACTION_PLANS_CSV: &FileLineRegexValidator{utils.ACTION_PLANS_NRCOLS,
regexp.MustCompile(`(?:\w+\s*,\s*){3}(?:\d+\.?\d*){1}`),
"Tag([0-9A-Za-z_]),ActionsTag([0-9A-Za-z_]),TimingTag([0-9A-Za-z_]),Weight([0-9.])"},
utils.ACTION_TRIGGERS_CSV: &FileLineRegexValidator{utils.ACTION_TRIGGERS_NRCOLS, regexp.MustCompile(`(?:\w+),(?:\*\w+)?,(?:\*out)?,(?:\*\w+),(?:\d+\.?\d*),(?:true|false)?,(?:\d+[smh]?),(?:\w+|\*any)?,(?:\d+\.?\d*)?,(?:\*\w+\s*|\+\d+[smh]\s*|\d+\s*)?,(?:\w+|\*any)?,(?:\w+|\*any)?,(?:\w+|\*any)?,(?:\d+)?,(?:\w+),(?:\d+\.?\d*)$`),
"Tag([0-9A-Za-z_]),BalanceType(*[a-z_]),Direction(*out),ThresholdType(*[a-z_]),ThresholdValue([0-9]+),Recurrent(true|false),MinSleep([0-9]+)?,BalanceDestinationTag([0-9A-Za-z_]|*all),BalanceWeight(*[a-z_]),BalanceExpiryTime(*[a-z_]|+[0-9][smh]|[0-9]),BalanceRatingSubject(*[a-z_]),BalanceCategory([a-z_]),BalanceSharedGroup(*[a-z_]),StatsMinQueuedItems([0-9]+),ActionsTag([0-9A-Za-z_]),Weight([0-9]+)"},
utils.ACTION_TRIGGERS_CSV: &FileLineRegexValidator{utils.ACTION_TRIGGERS_NRCOLS, regexp.MustCompile(`(?:\w+),(?:\*\w+),(?:\d+\.?\d*),(?:true|false)?,(?:\d+[smh]?),(?:\*\w+)?,(?:\*out)?,(?:\w+|\*any)?,(?:\w+|\*any)?,(?:\w+|\*any)?,(?:\w+|\*any)?,(?:\*\w+\s*|\+\d+[smh]\s*|\d+\s*)?,(?:\d+\.?\d*)?,(?:\d+)?,(?:\w+),(?:\d+\.?\d*)$`),
"Tag([0-9A-Za-z_]),ThresholdType(*[a-z_]),ThresholdValue([0-9]+),Recurrent(true|false),MinSleep([0-9]+)?,#### BalanceType(*[a-z_]),BalanceDirection(*out),BalanceCategory([a-z_]),BalanceDestinationTag([0-9A-Za-z_]|*all),BalanceRatingSubject(*[a-z_]),BalanceSharedGroup(*[a-z_]),BalanceExpiryTime(*[a-z_]|+[0-9][smh]|[0-9]),BalanceWeight(*[a-z_]),StatsMinQueuedItems([0-9]+),ActionsTag([0-9A-Za-z_]),Weight([0-9]+)"},
utils.ACCOUNT_ACTIONS_CSV: &FileLineRegexValidator{utils.ACCOUNT_ACTIONS_NRCOLS,
regexp.MustCompile(`(?:\w+\s*),(?:(\w+;?)+\s*),(?:\*out\s*),(?:\w+\s*),(?:\w+\s*)$`),
"Tenant([0-9A-Za-z_]),Account([0-9A-Za-z_.]),Direction(*out),ActionTimingsTag([0-9A-Za-z_]),ActionTriggersTag([0-9A-Za-z_])"},

View File

@@ -76,10 +76,10 @@ DUMMY,INVALID;DATA
`
var actionTriggersSample = `#Tag,BalanceTag,Direction,ThresholdType,ThresholdValue,Recurrent,MinSleep,BalanceDestinationTag,BalanceWeight,BalanceExpiryTime,BalanceRatingSubject,BalanceCategory,BalanceSharedGroup,StatsMinQueuedItems,ActionsTag,Weight
STANDARD_TRIGGERS,*monetary,*out,*min_balance,2,false,0,,,,,,,,LOG_WARNING,10
STANDARD_TRIGGERS,*monetary,*out,*max_balance,20,false,0,,,,,,,,LOG_WARNING,10
STANDARD_TRIGGERS,*monetary,*out,*max_counter,15,false,0,FS_USERS,,,,,,,LOG_WARNING,10
CDRST1_WARN_ASR,,,*min_asr,45,true,1h,,,,,,,3,CDRST_WARN_HTTP,10
STANDARD_TRIGGERS,*min_balance,2,false,0,*monetary,*out,,,,,,,,LOG_WARNING,10
STANDARD_TRIGGERS,*max_balance,20,false,0,*monetary,*out,,,,,,,,LOG_WARNING,10
STANDARD_TRIGGERS,*max_counter,15,false,0,*monetary,*out,,FS_USERS,,,,,,LOG_WARNING,10
CDRST1_WARN_ASR,*min_asr,45,true,1h,,,,,,,,,3,CDRST_WARN_HTTP,10
DUMMY,INVALID;DATA
`

View File

@@ -367,7 +367,6 @@ func (self *TPCSVImporter) importActions(fn string) error {
if err != nil {
return err
}
fieldIndex := CSV_FIELD_INDEX[utils.ACTIONS_CSV]
acts := make(map[string][]*utils.TPAction)
lineNr := 0
for {
@@ -381,18 +380,18 @@ func (self *TPCSVImporter) importActions(fn string) error {
}
continue
}
actId, actionType, balanceType, direction, destTag, rateSubject, category, sharedGroup := record[fieldIndex[utils.CSVFLD_ACTIONS_TAG]], record[fieldIndex[utils.CSVFLD_ACTION]],
record[fieldIndex[utils.CSVFLD_BALANCE_TYPE]], record[fieldIndex[utils.CSVFLD_DIRECTION]], record[fieldIndex[utils.CSVFLD_DESTINATION_TAG]], record[fieldIndex[utils.CSVFLD_RATING_SUBJECT]],
record[fieldIndex[utils.CSVFLD_CATEGORY]], record[fieldIndex[utils.CSVFLD_SHARED_GROUP]]
units, err := strconv.ParseFloat(record[fieldIndex[utils.CSVFLD_UNITS]], 64)
if err != nil && record[fieldIndex[utils.CSVFLD_UNITS]] != "" {
actId, actionType, balanceType, direction, destTag, rateSubject, category, sharedGroup := record[ACTSCSVIDX_TAG], record[ACTSCSVIDX_ACTION],
record[ACTSCSVIDX_BALANCE_TYPE], record[ACTSCSVIDX_DIRECTION], record[ACTSCSVIDX_DESTINATION_TAG], record[ACTSCSVIDX_RATING_SUBJECT],
record[ACTSCSVIDX_CATEGORY], record[ACTSCSVIDX_SHARED_GROUP]
units, err := strconv.ParseFloat(record[ACTSCSVIDX_UNITS], 64)
if err != nil && record[ACTSCSVIDX_UNITS] != "" {
if self.Verbose {
log.Printf("Ignoring line %d, warning: <%s> ", lineNr, err.Error())
}
continue
}
balanceWeight, _ := strconv.ParseFloat(record[fieldIndex[utils.CSVFLD_BALANCE_WEIGHT]], 64)
weight, err := strconv.ParseFloat(record[fieldIndex[utils.CSVFLD_WEIGHT]], 64)
balanceWeight, _ := strconv.ParseFloat(record[ACTSCSVIDX_BALANCE_WEIGHT], 64)
weight, err := strconv.ParseFloat(record[ACTSCSVIDX_WEIGHT], 64)
if err != nil {
if self.Verbose {
log.Printf("Ignoring line %d, warning: <%s> ", lineNr, err.Error())
@@ -407,13 +406,13 @@ func (self *TPCSVImporter) importActions(fn string) error {
BalanceType: balanceType,
Direction: direction,
Units: units,
ExpiryTime: record[5],
ExpiryTime: record[ACTSCSVIDX_EXPIRY_TIME],
DestinationId: destTag,
RatingSubject: rateSubject,
Category: category,
SharedGroup: sharedGroup,
BalanceWeight: balanceWeight,
ExtraParameters: record[fieldIndex[utils.CSVFLD_EXTRA_PARAMS]],
ExtraParameters: record[ACTSCSVIDX_EXTRA_PARAMS],
Weight: weight,
})
}
@@ -494,37 +493,39 @@ func (self *TPCSVImporter) importActionTriggers(fn string) error {
}
continue
}
tag, balanceType, direction, thresholdType, destinationTag, balanceExpirationDate, balanceRatingSubject, balanceCategory, balanceSharedGroup, actionsTag := record[0], record[1], record[2], record[3], record[7], record[9], record[10], record[10], record[12], record[14]
threshold, err := strconv.ParseFloat(record[4], 64)
tag, balanceType, direction, thresholdType, destinationTag, balanceExpirationDate, balanceRatingSubject, balanceCategory, balanceSharedGroup, actionsTag := record[ATRIGCSVIDX_TAG], record[ATRIGCSVIDX_BAL_TYPE],
record[ATRIGCSVIDX_BAL_DIRECTION], record[ATRIGCSVIDX_THRESHOLD_TYPE], record[ATRIGCSVIDX_BAL_DESTINATION_TAG], record[ATRIGCSVIDX_BAL_EXPIRY_TIME], record[ATRIGCSVIDX_BAL_RATING_SUBJECT],
record[ATRIGCSVIDX_BAL_CATEGORY], record[ATRIGCSVIDX_BAL_SHARED_GROUP], record[ATRIGCSVIDX_ACTIONS_TAG]
threshold, err := strconv.ParseFloat(record[ATRIGCSVIDX_THRESHOLD_VALUE], 64)
if err != nil {
if self.Verbose {
log.Printf("Ignoring line %d, warning: <%s> ", lineNr, err.Error())
}
continue
}
recurrent, err := strconv.ParseBool(record[5])
recurrent, err := strconv.ParseBool(record[ATRIGCSVIDX_RECURRENT])
if err != nil {
log.Printf("Ignoring line %d, warning: <%s>", lineNr, err.Error())
continue
}
minSleep, err := time.ParseDuration(record[6])
if err != nil && record[6] != "" {
minSleep, err := time.ParseDuration(record[ATRIGCSVIDX_MIN_SLEEP])
if err != nil && record[ATRIGCSVIDX_MIN_SLEEP] != "" {
log.Printf("Ignoring line %d, warning: <%s>", lineNr, err.Error())
continue
}
balanceWeight, err := strconv.ParseFloat(record[8], 64)
if err != nil && record[8] != "" {
balanceWeight, err := strconv.ParseFloat(record[ATRIGCSVIDX_BAL_WEIGHT], 64)
if err != nil && record[ATRIGCSVIDX_BAL_WEIGHT] != "" {
if self.Verbose {
log.Printf("Ignoring line %d, warning: <%s> ", lineNr, err.Error())
}
continue
}
minQueuedItems, err := strconv.Atoi(record[13])
if err != nil && record[12] != "" {
minQueuedItems, err := strconv.Atoi(record[ATRIGCSVIDX_STATS_MIN_QUEUED_ITEMS])
if err != nil && record[ATRIGCSVIDX_STATS_MIN_QUEUED_ITEMS] != "" {
log.Printf("Ignoring line %d, warning: <%s>", lineNr, err.Error())
continue
}
weight, err := strconv.ParseFloat(record[15], 64)
weight, err := strconv.ParseFloat(record[ATRIGCSVIDX_WEIGHT], 64)
if err != nil {
if self.Verbose {
log.Printf("Ignoring line %d, warning: <%s> ", lineNr, err.Error())

View File

@@ -53,19 +53,6 @@ const (
ACCOUNT_ACTIONS_CSV = "AccountActions.csv"
DERIVED_CHARGERS_CSV = "DerivedChargers.csv"
CDR_STATS_CSV = "CdrStats.csv"
CSVFLD_ACTIONS_TAG = "ActionsTag"
CSVFLD_ACTION = "Action"
CSVFLD_EXTRA_PARAMS = "ExtraParameters"
CSVFLD_BALANCE_TYPE = "BalanceType"
CSVFLD_DIRECTION = "Direction"
CSVFLD_CATEGORY = "Category"
CSVFLD_DESTINATION_TAG = "DestinationTag"
CSVFLD_RATING_SUBJECT = "RatingSubject"
CSVFLD_SHARED_GROUP = "SharedGroup"
CSVFLD_EXPIRY_TIME = "ExpiryTime"
CSVFLD_UNITS = "Units"
CSVFLD_BALANCE_WEIGHT = "BalanceWeight"
CSVFLD_WEIGHT = "Weight"
TIMINGS_NRCOLS = 6
DESTINATIONS_NRCOLS = 2
RATES_NRCOLS = 6