Replace Filter with FilterIDs in Thresholds

This commit is contained in:
TeoV
2017-10-23 18:45:26 +03:00
committed by Dan Christian Bogos
parent 70fbd6d71d
commit ab7b060c64
18 changed files with 244 additions and 195 deletions

View File

@@ -107,13 +107,14 @@ var tEvs = []*engine.ThresholdEvent{
var sTestsThresholdSV1 = []func(t *testing.T){
testV1TSLoadConfig,
testV1TSInitDataDb,
testV1TSResetStorDb,
testV1TSStartEngine,
testV1TSRpcConn,
testV1TSFromFolder,
testV1TSGetThresholds,
testV1TSProcessEvent,
testV1TSGetThresholdsAfterProcess,
testV1TSGetThresholdsAfterRestart,
//testV1TSGetThresholds,
//testV1TSProcessEvent,
//testV1TSGetThresholdsAfterProcess,
//testV1TSGetThresholdsAfterRestart,
testV1TSSetThresholdProfile,
testV1TSUpdateThresholdProfile,
testV1TSRemoveThresholdProfile,
@@ -130,7 +131,7 @@ func TestTSV1ITMySQL(t *testing.T) {
func TestTSV1ITMongo(t *testing.T) {
tSv1ConfDIR = "tutmongo"
time.Sleep(time.Duration(5 * time.Second)) // give time for engine to start
time.Sleep(time.Duration(2 * time.Second)) // give time for engine to start
for _, stest := range sTestsThresholdSV1 {
t.Run(tSv1ConfDIR, stest)
}
@@ -156,6 +157,13 @@ func testV1TSInitDataDb(t *testing.T) {
}
}
// Wipe out the cdr database
func testV1TSResetStorDb(t *testing.T) {
if err := engine.InitStorDb(tSv1Cfg); err != nil {
t.Fatal(err)
}
}
func testV1TSStartEngine(t *testing.T) {
if _, err := engine.StopStartEngine(tSv1CfgPath, thdsDelay); err != nil {
t.Fatal(err)
@@ -281,15 +289,9 @@ func testV1TSSetThresholdProfile(t *testing.T) {
t.Error(err)
}
tPrfl = &engine.ThresholdProfile{
Tenant: "cgrates.org",
ID: "TEST_PROFILE1",
Filters: []*engine.RequestFilter{
&engine.RequestFilter{
Type: "type",
FieldName: "Name",
Values: []string{"FilterValue1", "FilterValue2"},
},
},
Tenant: "cgrates.org",
ID: "TEST_PROFILE1",
FilterIDs: []string{"FilterID1", "FilterID2"},
ActivationInterval: &utils.ActivationInterval{
ActivationTime: time.Date(2014, 7, 14, 14, 25, 0, 0, time.UTC).Local(),
ExpiryTime: time.Date(2014, 7, 14, 14, 25, 0, 0, time.UTC).Local(),
@@ -317,23 +319,7 @@ func testV1TSSetThresholdProfile(t *testing.T) {
func testV1TSUpdateThresholdProfile(t *testing.T) {
var result string
tPrfl.Filters = []*engine.RequestFilter{
&engine.RequestFilter{
Type: "type",
FieldName: "Name",
Values: []string{"FilterValue1", "FilterValue2"},
},
&engine.RequestFilter{
Type: "*string",
FieldName: "Accout",
Values: []string{"1001", "1002"},
},
&engine.RequestFilter{
Type: "*string_prefix",
FieldName: "Destination",
Values: []string{"10", "20"},
},
}
tPrfl.FilterIDs = []string{"FilterID1", "FilterID2", "FilterID3"}
if err := tSv1Rpc.Call("ApierV1.SetThresholdProfile", tPrfl, &result); err != nil {
t.Error(err)
} else if result != utils.OK {

View File

@@ -456,9 +456,7 @@ CREATE TABLE tp_thresholds (
`tpid` varchar(64) NOT NULL,
`tenant` varchar(64) NOT NULL,
`id` varchar(64) NOT NULL,
`filter_type` varchar(16) NOT NULL,
`filter_field_name` varchar(64) NOT NULL,
`filter_field_values` varchar(256) NOT NULL,
`filter_ids` varchar(64) NOT NULL,
`activation_interval` varchar(64) NOT NULL,
`recurrent` BOOLEAN NOT NULL,
`min_hits` int(11) NOT NULL,
@@ -470,7 +468,7 @@ CREATE TABLE tp_thresholds (
`created_at` TIMESTAMP,
PRIMARY KEY (`pk`),
KEY `tpid` (`tpid`),
UNIQUE KEY `unique_tp_thresholds` (`tpid`,`tenant`, `id`, `filter_type`, `filter_field_name`)
UNIQUE KEY `unique_tp_thresholds` (`tpid`,`tenant`, `id`,`filter_ids`,`action_ids`)
);
--

View File

@@ -451,9 +451,7 @@ CREATE TABLE tp_thresholds (
"tpid" varchar(64) NOT NULL,
"tenant"varchar(64) NOT NULL,
"id" varchar(64) NOT NULL,
"filter_type" varchar(16) NOT NULL,
"filter_field_name" varchar(64) NOT NULL,
"filter_field_values" varchar(256) NOT NULL,
"filter_ids" varchar(64) NOT NULL,
"activation_interval" varchar(64) NOT NULL,
"recurrent" BOOLEAN NOT NULL,
"min_hits" INTEGER NOT NULL,
@@ -465,7 +463,7 @@ CREATE TABLE tp_thresholds (
"created_at" TIMESTAMP WITH TIME ZONE
);
CREATE INDEX tp_thresholds_idx ON tp_thresholds (tpid);
CREATE INDEX tp_thresholds_unique ON tp_thresholds ("tpid","tenant", "id", "filter_type", "filter_field_name");
CREATE INDEX tp_thresholds_unique ON tp_thresholds ("tpid","tenant", "id","filter_ids","action_ids");
--
-- Table structure for table `tp_filter`

View File

@@ -1,7 +1,24 @@
#Tenant[0],ID[1],FilterType[2],FilterFieldName[3],FilterFieldValues[4],ActivationInterval[5]
cgrates.org,FLTR_1,*string,Account,1001;1002,2014-07-29T15:00:00Z
cgrates.org,FLTR_1,*string_prefix,Destination,10;20,2014-07-29T15:00:00Z
cgrates.org,FLTR_1,*string_prefix,Destination,10;20,
cgrates.org,FLTR_1,*rsr_fields,,Subject(~^1.*1$);Destination(1002),
cgrates.org,FLTR_ACNT_dan,*string,Account,dan,2014-07-29T15:00:00Z
cgrates.org,FLTR_DST_DE,*destinations,Destination,DST_DE,2014-07-29T15:00:00Z
cgrates.org,FLTR_DST_NL,*destinations,Destination,DST_NL,2014-07-29T15:00:00Z
cgrates.org,FLTR_ACNT_BALANCE_1,*string,Account,1001;1002,2014-07-29T15:00:00Z
cgrates.org,FLTR_ACNT_BALANCE_1,*string,EventType,BalanceUpdate,
cgrates.org,FLTR_ACNT_BALANCE_1,*gte,Units,10.0,
cgrates.org,FLTR_ACNT_EXPIRED,*string,Account,1001;1002,2014-07-29T15:00:00Z
cgrates.org,FLTR_ACNT_EXPIRED,*gte,ExpiryTime,*now,
cgrates.org,FLTR_STATS_1,*string,EventType,StatUpdate,2014-07-29T15:00:00Z
cgrates.org,FLTR_STATS_1,*lt,ASR,40.0,
cgrates.org,FLTR_STATS_1,*lt,ACD,3m,
cgrates.org,FLTR_STATS_2,*string,EventType,StatUpdate,2014-07-29T15:00:00Z
cgrates.org,FLTR_STATS_2,*string,StatID,STATS_HOURLY_DE,
cgrates.org,FLTR_STATS_2,*gt,TCD,30m,
cgrates.org,FLTR_STATS_3,*string,EventType,StatUpdate,2014-07-29T15:00:00Z
cgrates.org,FLTR_STATS_3,*string,StatID,STATS_DAILY_DE,
cgrates.org,FLTR_STATS_3,*gt,TCD,3h,
cgrates.org,FLTR_RES_1,*string,EventType,ResourceUpdate,2014-07-29T15:00:00Z
cgrates.org,FLTR_RES_1,*string,ResourceID,RES_GRP_1,
cgrates.org,FLTR_RES_1,*gte,Usage,10.0,
1 #Tenant[0] ID[1] FilterType[2] FilterFieldName[3] FilterFieldValues[4] ActivationInterval[5]
2 cgrates.org FLTR_1 *string Account 1001;1002 2014-07-29T15:00:00Z
3 cgrates.org FLTR_1 *string_prefix Destination 10;20 2014-07-29T15:00:00Z
4 cgrates.org FLTR_1 *rsr_fields Subject(~^1.*1$);Destination(1002)
5 cgrates.org FLTR_ACNT_dan *string Account dan 2014-07-29T15:00:00Z
6 cgrates.org FLTR_DST_DE *destinations Destination DST_DE 2014-07-29T15:00:00Z
7 cgrates.org FLTR_DST_NL *destinations Destination DST_NL 2014-07-29T15:00:00Z
8 cgrates.org FLTR_ACNT_BALANCE_1 *string Account 1001;1002 2014-07-29T15:00:00Z
9 cgrates.org FLTR_ACNT_BALANCE_1 *string EventType BalanceUpdate
10 cgrates.org FLTR_ACNT_BALANCE_1 *gte Units 10.0
11 cgrates.org FLTR_ACNT_EXPIRED *string Account 1001;1002 2014-07-29T15:00:00Z
12 cgrates.org FLTR_ACNT_EXPIRED *gte ExpiryTime *now
13 cgrates.org FLTR_STATS_1 *string EventType StatUpdate 2014-07-29T15:00:00Z
14 cgrates.org FLTR_STATS_1 *lt ASR 40.0
15 cgrates.org FLTR_STATS_1 *lt ACD 3m
16 cgrates.org FLTR_STATS_2 *string EventType StatUpdate 2014-07-29T15:00:00Z
17 cgrates.org FLTR_STATS_2 *string StatID STATS_HOURLY_DE
18 cgrates.org FLTR_STATS_2 *gt TCD 30m
19 cgrates.org FLTR_STATS_3 *string EventType StatUpdate 2014-07-29T15:00:00Z
20 cgrates.org FLTR_STATS_3 *string StatID STATS_DAILY_DE
21 cgrates.org FLTR_STATS_3 *gt TCD 3h
22 cgrates.org FLTR_RES_1 *string EventType ResourceUpdate 2014-07-29T15:00:00Z
23 cgrates.org FLTR_RES_1 *string ResourceID RES_GRP_1
24 cgrates.org FLTR_RES_1 *gte Usage 10.0

View File

@@ -1,2 +1,2 @@
#Tenant[0],Id[1],FilterType[2],FilterFieldName[3],FilterFieldValues[4],ActivationInterval[5],Recurrent[6],MinHits[7],MinSleep[8],Blocker[9],Weight[10],ActionIDs[11],Async[12]
cgrates.org,Threshold1,*string,Account,1001;1002,2014-07-29T15:00:00Z,true,10,1s,true,10,THRESH1;THRESH2,true
#Tenant[0],Id[1],FilterIDs[2],ActivationInterval[3],Recurrent[4],MinHits[5],MinSleep[6],Blocker[7],Weight[8],ActionIDs[9],Async[10]
cgrates.org,Threshold1,FilterID1;FilterID2,2014-07-29T15:00:00Z,true,10,1s,true,10,THRESH1;THRESH2,true
1 #Tenant[0] Id[1] FilterType[2] FilterIDs[2] FilterFieldName[3] ActivationInterval[3] FilterFieldValues[4] Recurrent[4] ActivationInterval[5] MinHits[5] Recurrent[6] MinSleep[6] MinHits[7] Blocker[7] MinSleep[8] Weight[8] Blocker[9] ActionIDs[9] Weight[10] Async[10] ActionIDs[11] Async[12]
2 cgrates.org Threshold1 *string FilterID1;FilterID2 Account 2014-07-29T15:00:00Z 1001;1002 true 2014-07-29T15:00:00Z 10 true 1s 10 true 1s 10 true THRESH1;THRESH2 10 true THRESH1;THRESH2 true

View File

@@ -1,7 +1,24 @@
#Tenant[0],ID[1],FilterType[2],FilterFieldName[3],FilterFieldValues[4],ActivationInterval[5]
cgrates.org,FLTR_1,*string,Account,1001;1002,2014-07-29T15:00:00Z
cgrates.org,FLTR_1,*string_prefix,Destination,10;20,2014-07-29T15:00:00Z
cgrates.org,FLTR_1,*string_prefix,Destination,10;20,
cgrates.org,FLTR_1,*rsr_fields,,Subject(~^1.*1$);Destination(1002),
cgrates.org,FLTR_ACNT_dan,*string,Account,dan,2014-07-29T15:00:00Z
cgrates.org,FLTR_DST_DE,*destinations,Destination,DST_DE,2014-07-29T15:00:00Z
cgrates.org,FLTR_DST_NL,*destinations,Destination,DST_NL,2014-07-29T15:00:00Z
cgrates.org,FLTR_ACNT_BALANCE_1,*string,Account,1001;1002,2014-07-29T15:00:00Z
cgrates.org,FLTR_ACNT_BALANCE_1,*string,EventType,BalanceUpdate,
cgrates.org,FLTR_ACNT_BALANCE_1,*gte,Units,10.0,
cgrates.org,FLTR_ACNT_EXPIRED,*string,Account,1001;1002,2014-07-29T15:00:00Z
cgrates.org,FLTR_ACNT_EXPIRED,*gte,ExpiryTime,*now,
cgrates.org,FLTR_STATS_1,*string,EventType,StatUpdate,2014-07-29T15:00:00Z
cgrates.org,FLTR_STATS_1,*lt,ASR,40.0,
cgrates.org,FLTR_STATS_1,*lt,ACD,3m,
cgrates.org,FLTR_STATS_2,*string,EventType,StatUpdate,2014-07-29T15:00:00Z
cgrates.org,FLTR_STATS_2,*string,StatID,STATS_HOURLY_DE,
cgrates.org,FLTR_STATS_2,*gt,TCD,30m,
cgrates.org,FLTR_STATS_3,*string,EventType,StatUpdate,2014-07-29T15:00:00Z
cgrates.org,FLTR_STATS_3,*string,StatID,STATS_DAILY_DE,
cgrates.org,FLTR_STATS_3,*gt,TCD,3h,
cgrates.org,FLTR_RES_1,*string,EventType,ResourceUpdate,2014-07-29T15:00:00Z
cgrates.org,FLTR_RES_1,*string,ResourceID,RES_GRP_1,
cgrates.org,FLTR_RES_1,*gte,Usage,10.0,
1 #Tenant[0] ID[1] FilterType[2] FilterFieldName[3] FilterFieldValues[4] ActivationInterval[5]
2 cgrates.org FLTR_1 *string Account 1001;1002 2014-07-29T15:00:00Z
3 cgrates.org FLTR_1 *string_prefix Destination 10;20 2014-07-29T15:00:00Z
4 cgrates.org FLTR_1 *rsr_fields Subject(~^1.*1$);Destination(1002)
5 cgrates.org FLTR_ACNT_dan *string Account dan 2014-07-29T15:00:00Z
6 cgrates.org FLTR_DST_DE *destinations Destination DST_DE 2014-07-29T15:00:00Z
7 cgrates.org FLTR_DST_NL *destinations Destination DST_NL 2014-07-29T15:00:00Z
8 cgrates.org FLTR_ACNT_BALANCE_1 *string Account 1001;1002 2014-07-29T15:00:00Z
9 cgrates.org FLTR_ACNT_BALANCE_1 *string EventType BalanceUpdate
10 cgrates.org FLTR_ACNT_BALANCE_1 *gte Units 10.0
11 cgrates.org FLTR_ACNT_EXPIRED *string Account 1001;1002 2014-07-29T15:00:00Z
12 cgrates.org FLTR_ACNT_EXPIRED *gte ExpiryTime *now
13 cgrates.org FLTR_STATS_1 *string EventType StatUpdate 2014-07-29T15:00:00Z
14 cgrates.org FLTR_STATS_1 *lt ASR 40.0
15 cgrates.org FLTR_STATS_1 *lt ACD 3m
16 cgrates.org FLTR_STATS_2 *string EventType StatUpdate 2014-07-29T15:00:00Z
17 cgrates.org FLTR_STATS_2 *string StatID STATS_HOURLY_DE
18 cgrates.org FLTR_STATS_2 *gt TCD 30m
19 cgrates.org FLTR_STATS_3 *string EventType StatUpdate 2014-07-29T15:00:00Z
20 cgrates.org FLTR_STATS_3 *string StatID STATS_DAILY_DE
21 cgrates.org FLTR_STATS_3 *gt TCD 3h
22 cgrates.org FLTR_RES_1 *string EventType ResourceUpdate 2014-07-29T15:00:00Z
23 cgrates.org FLTR_RES_1 *string ResourceID RES_GRP_1
24 cgrates.org FLTR_RES_1 *gte Usage 10.0

View File

@@ -1,18 +1,9 @@
#Tenant[0],Id[1],FilterType[2],FilterFieldName[3],FilterFieldValues[4],ActivationInterval[5],Recurrent[6],MinHits[7],MinSleep[8],Blocker[9],Weight[10],ActionIDs[11],Async[12]
cgrates.org,THD_ACNT_BALANCE_1,*string,Account,1001;1002,2014-07-29T15:00:00Z,true,1,1s,false,10,LOG_WARNING,false
cgrates.org,THD_ACNT_BALANCE_1,*string,EventType,BalanceUpdate,,,,,,,,
cgrates.org,THD_ACNT_BALANCE_1,*gte,Units,10.0,,,,,,,,
cgrates.org,THD_ACNT_EXPIRED,*string,Account,1001;1002,2014-07-29T15:00:00Z,true,1,1s,false,10,LOG_WARNING,false
cgrates.org,THD_ACNT_EXPIRED,*gte,ExpiryTime,*now,,,,,,,,
cgrates.org,THD_STATS_1,*string,EventType,StatUpdate,2014-07-29T15:00:00Z,true,1,1s,false,10,LOG_WARNING,false
cgrates.org,THD_STATS_1,*lt,ASR,40.0,,,,,,,,
cgrates.org,THD_STATS_1,*lt,ACD,3m,,,,,,,,
cgrates.org,THD_STATS_2,*string,EventType,StatUpdate,2014-07-29T15:00:00Z,true,1,1s,false,10,DISABLE_AND_LOG,false
cgrates.org,THD_STATS_2,*string,StatID,STATS_HOURLY_DE,,,,,,,,
cgrates.org,THD_STATS_2,*gt,TCD,30m,,,,,,,,
cgrates.org,THD_STATS_3,*string,EventType,StatUpdate,2014-07-29T15:00:00Z,false,1,1s,false,10,TOPUP_100SMS_DE_MOBILE,false
cgrates.org,THD_STATS_3,*string,StatID,STATS_DAILY_DE,,,,,,,,
cgrates.org,THD_STATS_3,*gt,TCD,3h,,,,,,,,
cgrates.org,THD_RES_1,*string,EventType,ResourceUpdate,2014-07-29T15:00:00Z,true,1,1s,false,10,LOG_WARNING,false
cgrates.org,THD_RES_1,*string,ResourceID,RES_GRP_1,,,,,,,,
cgrates.org,THD_RES_1,*gte,Usage,10.0,,,,,,,,
#Tenant[0],Id[1],FilterIDs[2],ActivationInterval[3],Recurrent[4],MinHits[5],MinSleep[6],Blocker[7],Weight[8],ActionIDs[9],Async[10]
cgrates.org,THD_MLT_LINES,FLTR_RES_1;FLTR_STATS_1;FLTR_STATS_2,2014-07-29T15:00:00Z,true,1,1s,false,10,LOG_WARNING;DISABLE_AND_LOG,false
cgrates.org,THD_MLT_LINES,FLTR_RES_12,,,,,,,ACT6;ACT2;ACT3;ACT4,
cgrates.org,THD_MLT_LINES,,,,,,,,ACT1,
cgrates.org,THD_MLT_LINES2,FLTR_RES_1;FLTR_STATS_1,2014-07-29T15:00:00Z,true,1,1s,false,10,,false
cgrates.org,THD_MLT_LINES2,,,,,,,,ACT1,
cgrates.org,THD_MLT_LINES2,Filter1,,,,,,,,
cgrates.org,THD_MLT_LINES3,FLTR_RES_1;FLTR_STATS_1,2014-07-29T15:00:00Z,true,1,1s,false,10,,false
cgrates.org,THD_MLT_LINES3,,,,,,,,ACT1;ACT2,
1 #Tenant[0] Id[1] FilterType[2] FilterIDs[2] FilterFieldName[3] ActivationInterval[3] FilterFieldValues[4] Recurrent[4] ActivationInterval[5] MinHits[5] Recurrent[6] MinSleep[6] MinHits[7] Blocker[7] MinSleep[8] Weight[8] Blocker[9] ActionIDs[9] Weight[10] Async[10] ActionIDs[11] Async[12]
2 cgrates.org THD_ACNT_BALANCE_1 THD_MLT_LINES *string FLTR_RES_1;FLTR_STATS_1;FLTR_STATS_2 Account 2014-07-29T15:00:00Z 1001;1002 true 2014-07-29T15:00:00Z 1 true 1s 1 false 1s 10 false LOG_WARNING;DISABLE_AND_LOG 10 false LOG_WARNING false
3 cgrates.org THD_ACNT_BALANCE_1 THD_MLT_LINES *string FLTR_RES_12 EventType BalanceUpdate ACT6;ACT2;ACT3;ACT4
4 cgrates.org THD_ACNT_BALANCE_1 THD_MLT_LINES *gte Units 10.0 ACT1
5 cgrates.org THD_ACNT_EXPIRED THD_MLT_LINES2 *string FLTR_RES_1;FLTR_STATS_1 Account 2014-07-29T15:00:00Z 1001;1002 true 2014-07-29T15:00:00Z 1 true 1s 1 false 1s 10 false 10 false LOG_WARNING false
6 cgrates.org THD_ACNT_EXPIRED THD_MLT_LINES2 *gte ExpiryTime *now ACT1
7 cgrates.org THD_STATS_1 THD_MLT_LINES2 *string Filter1 EventType StatUpdate 2014-07-29T15:00:00Z true 1 1s false 10 LOG_WARNING false
8 cgrates.org THD_STATS_1 THD_MLT_LINES3 *lt FLTR_RES_1;FLTR_STATS_1 ASR 2014-07-29T15:00:00Z 40.0 true 1 1s false 10 false
9 cgrates.org THD_STATS_1 THD_MLT_LINES3 *lt ACD 3m ACT1;ACT2
cgrates.org THD_STATS_2 *string EventType StatUpdate 2014-07-29T15:00:00Z true 1 1s false 10 DISABLE_AND_LOG false
cgrates.org THD_STATS_2 *string StatID STATS_HOURLY_DE
cgrates.org THD_STATS_2 *gt TCD 30m
cgrates.org THD_STATS_3 *string EventType StatUpdate 2014-07-29T15:00:00Z false 1 1s false 10 TOPUP_100SMS_DE_MOBILE false
cgrates.org THD_STATS_3 *string StatID STATS_DAILY_DE
cgrates.org THD_STATS_3 *gt TCD 3h
cgrates.org THD_RES_1 *string EventType ResourceUpdate 2014-07-29T15:00:00Z true 1 1s false 10 LOG_WARNING false
cgrates.org THD_RES_1 *string ResourceID RES_GRP_1
cgrates.org THD_RES_1 *gte Usage 10.0

View File

@@ -277,8 +277,8 @@ cgrates.org,Stats1,*string,Account,1001;1002,2014-07-29T15:00:00Z,100,1s,*asr;*a
`
thresholds = `
#Tenant[0],Id[1],FilterType[2],FilterFieldName[3],FilterFieldValues[4],ActivationInterval[5],Recurrent[6],MinHits[7],MinSleep[8],Blocker[9],Weight[10],ActionIDs[11],Async[12]
cgrates.org,Threshold1,*string,Account,1001;1002,2014-07-29T15:00:00Z,true,10,1s,true,10,THRESH1;THRESH2,true
#Tenant[0],Id[1],FilterIDs[2],ActivationInterval[3],Recurrent[4],MinHits[5],MinSleep[6],Blocker[7],Weight[8],ActionIDs[9],Async[10]
cgrates.org,Threshold1,FilterID1;FilterID2,2014-07-29T15:00:00Z,true,10,1s,true,10,THRESH1;THRESH2,true
`
filters = `
@@ -1485,12 +1485,10 @@ func TestLoadThresholdProfiles(t *testing.T) {
eThresholds := map[string]map[string]*utils.TPThreshold{
"cgrates.org": map[string]*utils.TPThreshold{
"Threshold1": &utils.TPThreshold{
TPid: testTPID,
Tenant: "cgrates.org",
ID: "Threshold1",
Filters: []*utils.TPRequestFilter{
&utils.TPRequestFilter{Type: MetaString, FieldName: "Account", Values: []string{"1001", "1002"}},
},
TPid: testTPID,
Tenant: "cgrates.org",
ID: "Threshold1",
FilterIDs: []string{"FilterID1", "FilterID2"},
ActivationInterval: &utils.TPActivationInterval{
ActivationTime: "2014-07-29T15:00:00Z",
},

View File

@@ -1920,7 +1920,6 @@ func APItoModelResource(rl *utils.TPResource) (mdls TpResources) {
mdl.FilterFieldValues += utils.INFIELD_SEP
}
mdl.FilterFieldValues += val
}
mdls = append(mdls, mdl)
}
@@ -2143,7 +2142,10 @@ func (tps TpThresholdS) AsTPThreshold() (result []*utils.TPThreshold) {
}
}
if tp.ActionIDs != "" {
th.ActionIDs = append(th.ActionIDs, strings.Split(tp.ActionIDs, utils.INFIELD_SEP)...)
actionSplit := strings.Split(tp.ActionIDs, utils.INFIELD_SEP)
for _, action := range actionSplit {
th.ActionIDs = append(th.ActionIDs, action)
}
}
if tp.Weight != 0 {
th.Weight = tp.Weight
@@ -2158,12 +2160,13 @@ func (tps TpThresholdS) AsTPThreshold() (result []*utils.TPThreshold) {
th.ActivationInterval.ActivationTime = aiSplt[0]
}
}
if tp.FilterType != "" {
th.Filters = append(th.Filters, &utils.TPRequestFilter{
Type: tp.FilterType,
FieldName: tp.FilterFieldName,
Values: strings.Split(tp.FilterFieldValues, utils.INFIELD_SEP)})
if tp.FilterIDs != "" {
filterSplit := strings.Split(tp.FilterIDs, utils.INFIELD_SEP)
for _, filter := range filterSplit {
th.FilterIDs = append(th.FilterIDs, filter)
}
}
mst[tp.ID] = th
}
result = make([]*utils.TPThreshold, len(mst))
@@ -2176,48 +2179,119 @@ func (tps TpThresholdS) AsTPThreshold() (result []*utils.TPThreshold) {
}
func APItoModelTPThreshold(th *utils.TPThreshold) (mdls TpThresholdS) {
if len(th.Filters) == 0 {
return
}
for i, fltr := range th.Filters {
mdl := &TpThreshold{
Tpid: th.TPid,
Tenant: th.Tenant,
ID: th.ID,
if th != nil {
if len(th.FilterIDs) == 0 && len(th.ActionIDs) == 0 {
return
}
if i == 0 {
mdl.Blocker = th.Blocker
mdl.Weight = th.Weight
mdl.Recurrent = th.Recurrent
mdl.MinHits = th.MinHits
mdl.MinSleep = th.MinSleep
mdl.Async = th.Async
if th.ActivationInterval != nil {
if th.ActivationInterval.ActivationTime != "" {
mdl.ActivationInterval = th.ActivationInterval.ActivationTime
lenFilter := len(th.FilterIDs)
lenAction := len(th.ActionIDs)
var w int
if lenFilter > lenAction {
for i, action := range th.ActionIDs {
mdl := &TpThreshold{
Tpid: th.TPid,
Tenant: th.Tenant,
ID: th.ID,
ActionIDs: action,
FilterIDs: th.FilterIDs[i],
}
if th.ActivationInterval.ExpiryTime != "" {
mdl.ActivationInterval += utils.INFIELD_SEP + th.ActivationInterval.ExpiryTime
if i == 0 {
mdl.Blocker = th.Blocker
mdl.Weight = th.Weight
mdl.Recurrent = th.Recurrent
mdl.MinHits = th.MinHits
mdl.MinSleep = th.MinSleep
mdl.Async = th.Async
if th.ActivationInterval != nil {
if th.ActivationInterval.ActivationTime != "" {
mdl.ActivationInterval = th.ActivationInterval.ActivationTime
}
if th.ActivationInterval.ExpiryTime != "" {
mdl.ActivationInterval += utils.INFIELD_SEP + th.ActivationInterval.ExpiryTime
}
}
}
mdls = append(mdls, mdl)
w = i
}
for i, atid := range th.ActionIDs {
if i != 0 {
mdl.ActionIDs = mdl.ActionIDs + utils.INFIELD_SEP + atid
} else {
mdl.ActionIDs = atid
for j := w; j < lenFilter; j++ {
mdl := &TpThreshold{
Tpid: th.TPid,
Tenant: th.Tenant,
ID: th.ID,
FilterIDs: th.FilterIDs[j],
}
mdls = append(mdls, mdl)
}
}
if lenAction > lenFilter {
for i, filter := range th.FilterIDs {
mdl := &TpThreshold{
Tpid: th.TPid,
Tenant: th.Tenant,
ID: th.ID,
ActionIDs: th.ActionIDs[i],
FilterIDs: filter,
}
if i == 0 {
mdl.Blocker = th.Blocker
mdl.Weight = th.Weight
mdl.Recurrent = th.Recurrent
mdl.MinHits = th.MinHits
mdl.MinSleep = th.MinSleep
mdl.Async = th.Async
if th.ActivationInterval != nil {
if th.ActivationInterval.ActivationTime != "" {
mdl.ActivationInterval = th.ActivationInterval.ActivationTime
}
if th.ActivationInterval.ExpiryTime != "" {
mdl.ActivationInterval += utils.INFIELD_SEP + th.ActivationInterval.ExpiryTime
}
}
}
mdls = append(mdls, mdl)
w = i
}
for j := w; j < lenAction; j++ {
mdl := &TpThreshold{
Tpid: th.TPid,
Tenant: th.Tenant,
ID: th.ID,
ActionIDs: th.ActionIDs[j],
}
mdls = append(mdls, mdl)
}
}
if lenFilter == lenAction {
for i, filter := range th.FilterIDs {
mdl := &TpThreshold{
Tpid: th.TPid,
Tenant: th.Tenant,
ID: th.ID,
ActionIDs: th.ActionIDs[i],
FilterIDs: filter,
}
if i == 0 {
mdl.Blocker = th.Blocker
mdl.Weight = th.Weight
mdl.Recurrent = th.Recurrent
mdl.MinHits = th.MinHits
mdl.MinSleep = th.MinSleep
mdl.Async = th.Async
if th.ActivationInterval != nil {
if th.ActivationInterval.ActivationTime != "" {
mdl.ActivationInterval = th.ActivationInterval.ActivationTime
}
if th.ActivationInterval.ExpiryTime != "" {
mdl.ActivationInterval += utils.INFIELD_SEP + th.ActivationInterval.ExpiryTime
}
}
}
mdls = append(mdls, mdl)
}
mdl.FilterType = fltr.Type
mdl.FilterFieldName = fltr.FieldName
for i, val := range fltr.Values {
if i != 0 {
mdl.FilterFieldValues += utils.INFIELD_SEP
}
mdl.FilterFieldValues += val
}
mdls = append(mdls, mdl)
}
return
}
@@ -2231,7 +2305,6 @@ func APItoThresholdProfile(tpTH *utils.TPThreshold, timezone string) (th *Thresh
Weight: tpTH.Weight,
Blocker: tpTH.Blocker,
Async: tpTH.Async,
Filters: make([]*RequestFilter, len(tpTH.Filters)),
}
if tpTH.MinSleep != "" {
if th.MinSleep, err = utils.ParseDurationWithSecs(tpTH.MinSleep); err != nil {
@@ -2242,12 +2315,9 @@ func APItoThresholdProfile(tpTH *utils.TPThreshold, timezone string) (th *Thresh
th.ActionIDs = append(th.ActionIDs, ati)
}
for i, f := range tpTH.Filters {
rf := &RequestFilter{Type: f.Type, FieldName: f.FieldName, Values: f.Values}
if err := rf.CompileValues(); err != nil {
return nil, err
}
th.Filters[i] = rf
for _, fli := range tpTH.FilterIDs {
th.FilterIDs = append(th.FilterIDs, fli)
}
if tpTH.ActivationInterval != nil {
if th.ActivationInterval, err = tpTH.ActivationInterval.AsActivationInterval(timezone); err != nil {

View File

@@ -940,9 +940,7 @@ func TestAsTPThresholdAsAsTPThreshold(t *testing.T) {
&TpThreshold{
Tpid: "TEST_TPID",
ID: "Threhold",
FilterType: MetaStringPrefix,
FilterFieldName: "Account",
FilterFieldValues: "1001;1002",
FilterIDs: "FilterID1;FilterID2",
ActivationInterval: "2014-07-29T15:00:00Z",
Recurrent: false,
MinHits: 10,
@@ -954,15 +952,9 @@ func TestAsTPThresholdAsAsTPThreshold(t *testing.T) {
}
eTPs := []*utils.TPThreshold{
&utils.TPThreshold{
TPid: tps[0].Tpid,
ID: tps[0].ID,
Filters: []*utils.TPRequestFilter{
&utils.TPRequestFilter{
Type: tps[0].FilterType,
FieldName: tps[0].FilterFieldName,
Values: []string{"1001", "1002"},
},
},
TPid: tps[0].Tpid,
ID: tps[0].ID,
FilterIDs: []string{"FilterID1", "FilterID2"},
ActivationInterval: &utils.TPActivationInterval{
ActivationTime: tps[0].ActivationInterval,
},
@@ -982,11 +974,9 @@ func TestAsTPThresholdAsAsTPThreshold(t *testing.T) {
func TestAPItoTPThreshold(t *testing.T) {
tps := &utils.TPThreshold{
TPid: testTPID,
ID: "Stats1",
Filters: []*utils.TPRequestFilter{
&utils.TPRequestFilter{Type: MetaString, FieldName: "Account", Values: []string{"1001", "1002"}},
},
TPid: testTPID,
ID: "TH1",
FilterIDs: []string{"FilterID1", "FilterID2"},
ActivationInterval: &utils.TPActivationInterval{ActivationTime: "2014-07-29T15:00:00Z"},
Recurrent: false,
MinHits: 10,
@@ -998,18 +988,16 @@ func TestAPItoTPThreshold(t *testing.T) {
eTPs := &ThresholdProfile{
ID: tps.ID,
Filters: make([]*RequestFilter, len(tps.Filters)),
Recurrent: tps.Recurrent,
Blocker: tps.Blocker,
MinHits: tps.MinHits,
Weight: tps.Weight,
FilterIDs: tps.FilterIDs,
ActionIDs: []string{"WARN3"},
}
if eTPs.MinSleep, err = utils.ParseDurationWithSecs(tps.MinSleep); err != nil {
t.Errorf("Got error: %+v", err)
}
eTPs.Filters[0] = &RequestFilter{Type: MetaString,
FieldName: "Account", Values: []string{"1001", "1002"}}
at, _ := utils.ParseTimeDetectLayout("2014-07-29T15:00:00Z", "UTC")
eTPs.ActivationInterval = &utils.ActivationInterval{ActivationTime: at}
if st, err := APItoThresholdProfile(tps, "UTC"); err != nil {

View File

@@ -505,17 +505,15 @@ type TpThreshold struct {
Tpid string
Tenant string `index:"0" re:""`
ID string `index:"1" re:""`
FilterType string `index:"2" re:"^\*[A-Za-z].*"`
FilterFieldName string `index:"3" re:""`
FilterFieldValues string `index:"4" re:""`
ActivationInterval string `index:"5" re:""`
Recurrent bool `index:"6" re:""`
MinHits int `index:"7" re:""`
MinSleep string `index:"8" re:""`
Blocker bool `index:"9" re:""`
Weight float64 `index:"10" re:"\d+\.?\d*"`
ActionIDs string `index:"11" re:""`
Async bool `index:"12" re:""`
FilterIDs string `index:"2" re:""`
ActivationInterval string `index:"3" re:""`
Recurrent bool `index:"4" re:""`
MinHits int `index:"5" re:""`
MinSleep string `index:"6" re:""`
Blocker bool `index:"7" re:""`
Weight float64 `index:"8" re:"\d+\.?\d*"`
ActionIDs string `index:"9" re:""`
Async bool `index:"10" re:""`
CreatedAt time.Time
}

View File

@@ -2055,7 +2055,7 @@ func testOnStorITCRUDThresholdProfile(t *testing.T) {
Tenant: "cgrates.org",
ID: "test",
ActivationInterval: &utils.ActivationInterval{},
Filters: []*RequestFilter{},
FilterIDs: []string{},
Recurrent: true,
MinSleep: timeMinSleep,
Blocker: true,

View File

@@ -1297,11 +1297,6 @@ func (ms *MapStorage) GetThresholdProfileDrv(tenant, ID string) (tp *ThresholdPr
if err != nil {
return nil, err
}
for _, fltr := range tp.Filters {
if err := fltr.CompileValues(); err != nil {
return nil, err
}
}
return
}

View File

@@ -1888,11 +1888,6 @@ func (ms *MongoStorage) GetThresholdProfileDrv(tenant, ID string) (tp *Threshold
}
return nil, err
}
for _, fltr := range tp.Filters {
if err = fltr.CompileValues(); err != nil {
return
}
}
return
}

View File

@@ -1447,11 +1447,6 @@ func (rs *RedisStorage) GetThresholdProfileDrv(tenant, ID string) (tp *Threshold
if err = rs.ms.Unmarshal(values, &tp); err != nil {
return
}
for _, fltr := range tp.Filters {
if err = fltr.CompileValues(); err != nil {
return
}
}
return
}

View File

@@ -36,7 +36,7 @@ import (
type ThresholdProfile struct {
Tenant string
ID string
Filters []*RequestFilter // Filters for the request
FilterIDs []string
ActivationInterval *utils.ActivationInterval // Time when this limit becomes active and expires
Recurrent bool
MinHits int
@@ -270,18 +270,20 @@ func (tS *ThresholdService) matchingThresholdsForEvent(ev *ThresholdEvent) (ts T
!tPrfl.ActivationInterval.IsActiveAtTime(time.Now()) { // not active
continue
}
passAllFilters := true
for _, fltr := range tPrfl.Filters {
if pass, err := fltr.Pass(ev.FilterableEvent(nil), "", tS.statS); err != nil {
return nil, err
} else if !pass {
passAllFilters = false
/*
passAllFilters := true
for _, fltr := range tPrfl.Filters {
if pass, err := fltr.Pass(ev.FilterableEvent(nil), "", tS.statS); err != nil {
return nil, err
} else if !pass {
passAllFilters = false
continue
}
}
if !passAllFilters {
continue
}
}
if !passAllFilters {
continue
}
*/
t, err := tS.dm.GetThreshold(tPrfl.Tenant, tPrfl.ID, false, "")
if err != nil {
return nil, err

View File

@@ -2217,31 +2217,32 @@ func (tpr *TpReader) WriteToDatabase(flush, verbose, disable_reverse bool) (err
}
}
}
if len(tpr.thProfiles) > 0 {
if verbose {
log.Print("Indexing thresholds")
}
for tenant, mpID := range tpr.thProfiles {
stIdxr, err := NewReqFilterIndexer(tpr.dm, utils.ThresholdsIndex+tenant)
if err != nil {
return err
/*
if len(tpr.thProfiles) > 0 {
if verbose {
log.Print("Indexing thresholds")
}
for _, tpTH := range mpID {
if th, err := APItoThresholdProfile(tpTH, tpr.timezone); err != nil {
for tenant, mpID := range tpr.thProfiles {
stIdxr, err := NewReqFilterIndexer(tpr.dm, utils.ThresholdsIndex+tenant)
if err != nil {
return err
}
for _, tpTH := range mpID {
if th, err := APItoThresholdProfile(tpTH, tpr.timezone); err != nil {
return err
} else {
stIdxr.IndexFilters(th.ID, th.Filters)
}
}
if verbose {
log.Printf("Indexed thresholds tenant: %s, keys %+v", tenant, stIdxr.ChangedKeys().Slice())
}
if err := stIdxr.StoreIndexes(); err != nil {
return err
} else {
stIdxr.IndexFilters(th.ID, th.Filters)
}
}
if verbose {
log.Printf("Indexed thresholds tenant: %s, keys %+v", tenant, stIdxr.ChangedKeys().Slice())
}
if err := stIdxr.StoreIndexes(); err != nil {
return err
}
}
}
*/
if len(tpr.flProfiles) > 0 {
if verbose {
log.Print("Indexing Filters")

View File

@@ -1359,7 +1359,7 @@ type TPThreshold struct {
TPid string
Tenant string
ID string
Filters []*TPRequestFilter // Filters for the request
FilterIDs []string
ActivationInterval *TPActivationInterval // Time when this limit becomes active and expires
Recurrent bool
MinHits int