From 0532732aee2675a0f01d9b49d0024e1ed21d2820 Mon Sep 17 00:00:00 2001 From: DanB Date: Mon, 1 Aug 2016 11:15:34 +0200 Subject: [PATCH] RequestFilter with passString, started ResourceLimiterService --- engine/reqfilter.go | 16 ++++++++++++++++ engine/reqfilter_test.go | 18 ++++++++++++++++++ engine/reslimiter.go | 5 +++++ 3 files changed, 39 insertions(+) diff --git a/engine/reqfilter.go b/engine/reqfilter.go index 6ea3e5247..23c5d444a 100644 --- a/engine/reqfilter.go +++ b/engine/reqfilter.go @@ -29,6 +29,7 @@ import ( ) const ( + MetaString = "*string" MetaStringPrefix = "*string_prefix" MetaTimings = "*timings" MetaRSRFields = "*rsr_fields" @@ -101,6 +102,8 @@ type RequestFilter struct { // Pass is the method which should be used from outside. func (fltr *RequestFilter) Pass(req interface{}, extraFieldsLabel string) (bool, error) { switch fltr.Type { + case MetaString: + return fltr.passString(req, extraFieldsLabel) case MetaStringPrefix: return fltr.passStringPrefix(req, extraFieldsLabel) case MetaTimings: @@ -116,6 +119,19 @@ func (fltr *RequestFilter) Pass(req interface{}, extraFieldsLabel string) (bool, } } +func (fltr *RequestFilter) passString(req interface{}, extraFieldsLabel string) (bool, error) { + strVal, err := utils.ReflectFieldAsString(req, fltr.FieldName, extraFieldsLabel) + if err != nil { + return false, err + } + for _, val := range fltr.Values { + if strVal == val { + return true, nil + } + } + return false, nil +} + func (fltr *RequestFilter) passStringPrefix(req interface{}, extraFieldsLabel string) (bool, error) { strVal, err := utils.ReflectFieldAsString(req, fltr.FieldName, extraFieldsLabel) if err != nil { diff --git a/engine/reqfilter_test.go b/engine/reqfilter_test.go index ad4af702d..553e1e12c 100644 --- a/engine/reqfilter_test.go +++ b/engine/reqfilter_test.go @@ -25,6 +25,24 @@ import ( "github.com/cgrates/cgrates/utils" ) +func TestPassString(t *testing.T) { + cd := &CallDescriptor{Direction: "*out", Category: "call", Tenant: "cgrates.org", Subject: "dan", Destination: "+4986517174963", + TimeStart: time.Date(2013, time.October, 7, 14, 50, 0, 0, time.UTC), TimeEnd: time.Date(2013, time.October, 7, 14, 52, 12, 0, time.UTC), + DurationIndex: 132 * time.Second, ExtraFields: map[string]string{"navigation": "off"}} + rf := &RequestFilter{Type: MetaString, FieldName: "Category", Values: []string{"call"}} + if passes, err := rf.passString(cd, ""); err != nil { + t.Error(err) + } else if !passes { + t.Error("Not passes filter") + } + rf = &RequestFilter{Type: MetaString, FieldName: "Category", Values: []string{"cal"}} + if passes, err := rf.passString(cd, ""); err != nil { + t.Error(err) + } else if passes { + t.Error("Filter passes") + } +} + func TestPassStringPrefix(t *testing.T) { cd := &CallDescriptor{Direction: "*out", Category: "call", Tenant: "cgrates.org", Subject: "dan", Destination: "+4986517174963", TimeStart: time.Date(2013, time.October, 7, 14, 50, 0, 0, time.UTC), TimeEnd: time.Date(2013, time.October, 7, 14, 52, 12, 0, time.UTC), diff --git a/engine/reslimiter.go b/engine/reslimiter.go index aedcc5146..618c0fffe 100644 --- a/engine/reslimiter.go +++ b/engine/reslimiter.go @@ -31,3 +31,8 @@ type ResourceLimit struct { Limit float64 // Limit value ActionTriggers ActionTriggers // Thresholds to check after changing Limit } + +// ResourcesLimiter is the service handling channel limits +type ResourceLimiterService struct { + stringIndexes map[string]map[string]string // map[fieldName]map[fieldValue]resourceID +}