mirror of
https://github.com/cgrates/cgrates.git
synced 2026-02-17 14:19:54 +05:00
Replace Filter with FilterIDs in Thresholds
This commit is contained in:
committed by
Dan Christian Bogos
parent
70fbd6d71d
commit
ab7b060c64
@@ -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 {
|
||||
|
||||
@@ -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`)
|
||||
);
|
||||
|
||||
--
|
||||
|
||||
@@ -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`
|
||||
|
||||
@@ -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,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,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,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,
|
||||
|
||||
|
@@ -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",
|
||||
},
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user