diff --git a/engine/model_helpers_test.go b/engine/model_helpers_test.go index 183ac5032..684a51399 100644 --- a/engine/model_helpers_test.go +++ b/engine/model_helpers_test.go @@ -1557,7 +1557,7 @@ func TestModelAsTPAttribute2(t *testing.T) { Tenant: "cgrates.org", ID: "ALS1", Contexts: "con1", - FilterIDs: "FLTR_ACNT_dan;FLTR_DST_DE;*ai:~*req.AnswerTime:2014-07-14T14:35:00Z;2014-07-14T14:36:00Z", + FilterIDs: "FLTR_ACNT_dan;FLTR_DST_DE;*ai:~*req.AnswerTime:2014-07-14T14:35:00Z|2014-07-14T14:36:00Z", Path: utils.MetaReq + utils.NestingSep + "FL1", Value: "Al1", Weight: 20, @@ -1568,7 +1568,7 @@ func TestModelAsTPAttribute2(t *testing.T) { Tenant: "cgrates.org", ID: "ALS1", Contexts: []string{"con1"}, - FilterIDs: []string{"*ai:~*req.AnswerTime:2014-07-14T14:35:00Z;2014-07-14T14:36:00Z", "FLTR_ACNT_dan", "FLTR_DST_DE"}, + FilterIDs: []string{"*ai:~*req.AnswerTime:2014-07-14T14:35:00Z|2014-07-14T14:36:00Z", "FLTR_ACNT_dan", "FLTR_DST_DE"}, Attributes: []*utils.TPAttribute{ { FilterIDs: []string{}, diff --git a/engine/z_attributes_test.go b/engine/z_attributes_test.go index f4caa4bf6..a687ca855 100644 --- a/engine/z_attributes_test.go +++ b/engine/z_attributes_test.go @@ -485,7 +485,7 @@ func TestAttributeProcessWithMultipleRuns1(t *testing.T) { Tenant: config.CgrConfig().GeneralCfg().DefaultTenant, ID: "ATTR_1", Contexts: []string{utils.MetaSessionS}, - FilterIDs: []string{"*string:~*req.InitialField:InitialValue", "*ai:~*req.AnswerTime:2014-07-14T14:25:00Z"}, + FilterIDs: []string{"*string:~*req.InitialField:InitialValue", "*ai:*now:2014-07-14T14:25:00Z"}, Attributes: []*Attribute{ { Path: utils.MetaReq + utils.NestingSep + "Field1", @@ -498,7 +498,7 @@ func TestAttributeProcessWithMultipleRuns1(t *testing.T) { Tenant: config.CgrConfig().GeneralCfg().DefaultTenant, ID: "ATTR_2", Contexts: []string{utils.MetaSessionS}, - FilterIDs: []string{"*string:~*req.Field1:Value1", "*ai:~*req.AnswerTime:2014-07-14T14:25:00Z"}, + FilterIDs: []string{"*string:~*req.Field1:Value1", "*ai:*now:2014-07-14T14:25:00Z"}, Attributes: []*Attribute{ { Path: utils.MetaReq + utils.NestingSep + "Field2", @@ -511,7 +511,7 @@ func TestAttributeProcessWithMultipleRuns1(t *testing.T) { Tenant: config.CgrConfig().GeneralCfg().DefaultTenant, ID: "ATTR_3", Contexts: []string{utils.MetaSessionS}, - FilterIDs: []string{"*string:~*req.Field2:Value2", "*ai:~*req.AnswerTime:2014-07-14T14:25:00Z"}, + FilterIDs: []string{"*string:~*req.Field2:Value2", "*ai:*now:2014-07-14T14:25:00Z"}, Attributes: []*Attribute{ { Path: utils.MetaReq + utils.NestingSep + "Field3", @@ -589,7 +589,7 @@ func TestAttributeProcessWithMultipleRuns2(t *testing.T) { Tenant: config.CgrConfig().GeneralCfg().DefaultTenant, ID: "ATTR_1", Contexts: []string{utils.MetaSessionS}, - FilterIDs: []string{"*string:~*req.InitialField:InitialValue", "*ai:~*req.AnswerTime:2014-07-14T14:25:00Z"}, + FilterIDs: []string{"*string:~*req.InitialField:InitialValue", "*ai:*now:2014-07-14T14:25:00Z"}, Attributes: []*Attribute{ { Path: utils.MetaReq + utils.NestingSep + "Field1", @@ -602,7 +602,7 @@ func TestAttributeProcessWithMultipleRuns2(t *testing.T) { Tenant: config.CgrConfig().GeneralCfg().DefaultTenant, ID: "ATTR_2", Contexts: []string{utils.MetaSessionS}, - FilterIDs: []string{"*string:~*req.Field1:Value1", "*ai:~*req.AnswerTime:2014-07-14T14:25:00Z"}, + FilterIDs: []string{"*string:~*req.Field1:Value1", "*ai:*now:2014-07-14T14:25:00Z"}, Attributes: []*Attribute{ { Path: utils.MetaReq + utils.NestingSep + "Field2", @@ -615,7 +615,7 @@ func TestAttributeProcessWithMultipleRuns2(t *testing.T) { Tenant: config.CgrConfig().GeneralCfg().DefaultTenant, ID: "ATTR_3", Contexts: []string{utils.MetaSessionS}, - FilterIDs: []string{"*string:~*req.NotFound:NotFound", "*ai:~*req.AnswerTime:2014-07-14T14:25:00Z"}, + FilterIDs: []string{"*string:~*req.NotFound:NotFound", "*ai:*now:2014-07-14T14:25:00Z"}, Attributes: []*Attribute{ { Path: utils.MetaReq + utils.NestingSep + "Field3", @@ -689,7 +689,7 @@ func TestAttributeProcessWithMultipleRuns3(t *testing.T) { Tenant: config.CgrConfig().GeneralCfg().DefaultTenant, ID: "ATTR_1", Contexts: []string{utils.MetaSessionS}, - FilterIDs: []string{"*string:~*req.InitialField:InitialValue", "*ai:~*req.AnswerTime:2014-07-14T14:25:00Z"}, + FilterIDs: []string{"*string:~*req.InitialField:InitialValue", "*ai:*now:2014-07-14T14:25:00Z"}, Attributes: []*Attribute{ { Path: utils.MetaReq + utils.NestingSep + "Field1", @@ -702,7 +702,7 @@ func TestAttributeProcessWithMultipleRuns3(t *testing.T) { Tenant: config.CgrConfig().GeneralCfg().DefaultTenant, ID: "ATTR_2", Contexts: []string{utils.MetaSessionS}, - FilterIDs: []string{"*string:~*req.Field1:Value1", "*ai:~*req.AnswerTime:2014-07-14T14:25:00Z"}, + FilterIDs: []string{"*string:~*req.Field1:Value1", "*ai:*now:2014-07-14T14:25:00Z"}, Attributes: []*Attribute{ { Path: utils.MetaReq + utils.NestingSep + "Field2", @@ -715,7 +715,7 @@ func TestAttributeProcessWithMultipleRuns3(t *testing.T) { Tenant: config.CgrConfig().GeneralCfg().DefaultTenant, ID: "ATTR_3", Contexts: []string{utils.MetaSessionS}, - FilterIDs: []string{"*string:~*req.Field2:Value2", "*ai:~*req.AnswerTime:2014-07-14T14:25:00Z"}, + FilterIDs: []string{"*string:~*req.Field2:Value2", "*ai:*now:2014-07-14T14:25:00Z"}, Attributes: []*Attribute{ { Path: utils.MetaReq + utils.NestingSep + "Field3", @@ -789,7 +789,7 @@ func TestAttributeProcessWithMultipleRuns4(t *testing.T) { Tenant: config.CgrConfig().GeneralCfg().DefaultTenant, ID: "ATTR_1", Contexts: []string{utils.MetaSessionS}, - FilterIDs: []string{"*string:~*req.InitialField:InitialValue", "*ai:~*req.AnswerTime:2014-07-14T14:25:00Z"}, + FilterIDs: []string{"*string:~*req.InitialField:InitialValue", "*ai:*now:2014-07-14T14:25:00Z"}, Attributes: []*Attribute{ { Path: utils.MetaReq + utils.NestingSep + "Field1", @@ -802,7 +802,7 @@ func TestAttributeProcessWithMultipleRuns4(t *testing.T) { Tenant: config.CgrConfig().GeneralCfg().DefaultTenant, ID: "ATTR_2", Contexts: []string{utils.MetaSessionS}, - FilterIDs: []string{"*string:~*req.Field1:Value1", "*ai:~*req.AnswerTime:2014-07-14T14:25:00Z"}, + FilterIDs: []string{"*string:~*req.Field1:Value1", "*ai:*now:2014-07-14T14:25:00Z"}, Attributes: []*Attribute{ { Path: utils.MetaReq + utils.NestingSep + "Field2", @@ -875,7 +875,7 @@ func TestAttributeMultipleProcessWithBlocker(t *testing.T) { Tenant: config.CgrConfig().GeneralCfg().DefaultTenant, ID: "ATTR_1", Contexts: []string{utils.MetaSessionS}, - FilterIDs: []string{"*string:~*req.InitialField:InitialValue", "*ai:~*req.AnswerTime:2014-07-14T14:25:00Z"}, + FilterIDs: []string{"*string:~*req.InitialField:InitialValue", "*ai:*now:2014-07-14T14:25:00Z"}, Attributes: []*Attribute{ { Path: utils.MetaReq + utils.NestingSep + "Field1", @@ -888,7 +888,7 @@ func TestAttributeMultipleProcessWithBlocker(t *testing.T) { Tenant: config.CgrConfig().GeneralCfg().DefaultTenant, ID: "ATTR_2", Contexts: []string{utils.MetaSessionS}, - FilterIDs: []string{"*string:~*req.Field1:Value1", "*ai:~*req.AnswerTime:2014-07-14T14:25:00Z"}, + FilterIDs: []string{"*string:~*req.Field1:Value1", "*ai:*now:2014-07-14T14:25:00Z"}, Attributes: []*Attribute{ { Path: utils.MetaReq + utils.NestingSep + "Field2", @@ -902,7 +902,7 @@ func TestAttributeMultipleProcessWithBlocker(t *testing.T) { Tenant: config.CgrConfig().GeneralCfg().DefaultTenant, ID: "ATTR_3", Contexts: []string{utils.MetaSessionS}, - FilterIDs: []string{"*string:~*req.Field2:Value2", "*ai:~*req.AnswerTime:2014-07-14T14:25:00Z"}, + FilterIDs: []string{"*string:~*req.Field2:Value2", "*ai:*now:2014-07-14T14:25:00Z"}, Attributes: []*Attribute{ { Path: utils.MetaReq + utils.NestingSep + "Field3", @@ -977,7 +977,7 @@ func TestAttributeMultipleProcessWithBlocker2(t *testing.T) { Tenant: config.CgrConfig().GeneralCfg().DefaultTenant, ID: "ATTR_1", Contexts: []string{utils.MetaSessionS}, - FilterIDs: []string{"*string:~*req.InitialField:InitialValue", "*ai:~*req.AnswerTime:2014-07-14T14:25:00Z"}, + FilterIDs: []string{"*string:~*req.InitialField:InitialValue", "*ai:*now:2014-07-14T14:25:00Z"}, Attributes: []*Attribute{ { Path: utils.MetaReq + utils.NestingSep + "Field1", @@ -991,7 +991,7 @@ func TestAttributeMultipleProcessWithBlocker2(t *testing.T) { Tenant: config.CgrConfig().GeneralCfg().DefaultTenant, ID: "ATTR_2", Contexts: []string{utils.MetaSessionS}, - FilterIDs: []string{"*string:~*req.Field1:Value1", "*ai:~*req.AnswerTime:2014-07-14T14:25:00Z"}, + FilterIDs: []string{"*string:~*req.Field1:Value1", "*ai:*now:2014-07-14T14:25:00Z"}, Attributes: []*Attribute{ { Path: utils.MetaReq + utils.NestingSep + "Field2", @@ -1004,7 +1004,7 @@ func TestAttributeMultipleProcessWithBlocker2(t *testing.T) { Tenant: config.CgrConfig().GeneralCfg().DefaultTenant, ID: "ATTR_3", Contexts: []string{utils.MetaSessionS}, - FilterIDs: []string{"*string:~*req.Field2:Value2", "*ai:~*req.AnswerTime:2014-07-14T14:25:00Z"}, + FilterIDs: []string{"*string:~*req.Field2:Value2", "*ai:*now:2014-07-14T14:25:00Z"}, Attributes: []*Attribute{ { Path: utils.MetaReq + utils.NestingSep + "Field3", @@ -1076,7 +1076,7 @@ func TestAttributeProcessValue(t *testing.T) { Tenant: config.CgrConfig().GeneralCfg().DefaultTenant, ID: "ATTR_1", Contexts: []string{utils.MetaSessionS}, - FilterIDs: []string{"*string:~*req.Field1:Value1", "*ai:~*req.AnswerTime:2014-07-14T14:25:00Z"}, + FilterIDs: []string{"*string:~*req.Field1:Value1", "*ai:*now:2014-07-14T14:25:00Z"}, Attributes: []*Attribute{ { Path: utils.MetaReq + utils.NestingSep + "Field2", @@ -1221,7 +1221,7 @@ func TestAttributeProcessEventConstant(t *testing.T) { Tenant: config.CgrConfig().GeneralCfg().DefaultTenant, ID: "ATTR_1", Contexts: []string{utils.MetaSessionS}, - FilterIDs: []string{"*string:~*req.Field1:Value1", "*ai:~*req.AnswerTime:2014-07-14T14:25:00Z"}, + FilterIDs: []string{"*string:~*req.Field1:Value1", "*ai:*now:2014-07-14T14:25:00Z"}, Attributes: []*Attribute{ { Path: utils.MetaReq + utils.NestingSep + "Field2", @@ -1289,7 +1289,7 @@ func TestAttributeProcessEventVariable(t *testing.T) { Tenant: config.CgrConfig().GeneralCfg().DefaultTenant, ID: "ATTR_1", Contexts: []string{utils.MetaSessionS}, - FilterIDs: []string{"*string:~*req.Field1:Value1", "*ai:~*req.AnswerTime:2014-07-14T14:25:00Z"}, + FilterIDs: []string{"*string:~*req.Field1:Value1", "*ai:*now:2014-07-14T14:25:00Z"}, Attributes: []*Attribute{ { Path: utils.MetaReq + utils.NestingSep + "Field2", @@ -1364,7 +1364,7 @@ func TestAttributeProcessEventComposed(t *testing.T) { Tenant: config.CgrConfig().GeneralCfg().DefaultTenant, ID: "ATTR_1", Contexts: []string{utils.MetaSessionS}, - FilterIDs: []string{"*string:~*req.Field1:Value1", "*ai:~*req.AnswerTime:2014-07-14T14:25:00Z"}, + FilterIDs: []string{"*string:~*req.Field1:Value1", "*ai:*now:2014-07-14T14:25:00Z"}, Attributes: []*Attribute{ { Path: utils.MetaReq + utils.NestingSep + "Field2", @@ -1444,7 +1444,7 @@ func TestAttributeProcessEventSum(t *testing.T) { Tenant: config.CgrConfig().GeneralCfg().DefaultTenant, ID: "ATTR_1", Contexts: []string{utils.MetaSessionS}, - FilterIDs: []string{"*string:~*req.Field1:Value1", "*ai:~*req.AnswerTime:2014-07-14T14:25:00Z"}, + FilterIDs: []string{"*string:~*req.Field1:Value1", "*ai:*now:2014-07-14T14:25:00Z"}, Attributes: []*Attribute{ { Path: utils.MetaReq + utils.NestingSep + "Field2", @@ -1516,7 +1516,7 @@ func TestAttributeProcessEventUsageDifference(t *testing.T) { Tenant: config.CgrConfig().GeneralCfg().DefaultTenant, ID: "ATTR_1", Contexts: []string{utils.MetaSessionS}, - FilterIDs: []string{"*string:~*req.Field1:Value1", "*ai:~*req.AnswerTime:2014-07-14T14:25:00Z"}, + FilterIDs: []string{"*string:~*req.Field1:Value1", "*ai:*now:2014-07-14T14:25:00Z"}, Attributes: []*Attribute{ { Path: utils.MetaReq + utils.NestingSep + "Field2", @@ -1590,7 +1590,7 @@ func TestAttributeProcessEventValueExponent(t *testing.T) { Tenant: config.CgrConfig().GeneralCfg().DefaultTenant, ID: "ATTR_1", Contexts: []string{utils.MetaSessionS}, - FilterIDs: []string{"*string:~*req.Field1:Value1", "*ai:~*req.AnswerTime:2014-07-14T14:25:00Z"}, + FilterIDs: []string{"*string:~*req.Field1:Value1", "*ai:*now:2014-07-14T14:25:00Z"}, Attributes: []*Attribute{ { Path: utils.MetaReq + utils.NestingSep + "Field2", @@ -1669,7 +1669,7 @@ func BenchmarkAttributeProcessEventConstant(b *testing.B) { Tenant: config.CgrConfig().GeneralCfg().DefaultTenant, ID: "ATTR_1", Contexts: []string{utils.MetaSessionS}, - FilterIDs: []string{"*string:~*req.Field1:Value1", "*ai:~*req.AnswerTime:2014-07-14T14:25:00Z"}, + FilterIDs: []string{"*string:~*req.Field1:Value1", "*ai:*now:2014-07-14T14:25:00Z"}, Attributes: []*Attribute{ { Path: utils.MetaReq + utils.NestingSep + "Field2", @@ -1725,7 +1725,7 @@ func BenchmarkAttributeProcessEventVariable(b *testing.B) { Tenant: config.CgrConfig().GeneralCfg().DefaultTenant, ID: "ATTR_1", Contexts: []string{utils.MetaSessionS}, - FilterIDs: []string{"*string:~*req.Field1:Value1", "*ai:~*req.AnswerTime:2014-07-14T14:25:00Z"}, + FilterIDs: []string{"*string:~*req.Field1:Value1", "*ai:*now:2014-07-14T14:25:00Z"}, Attributes: []*Attribute{ { Path: utils.MetaReq + utils.NestingSep + "Field2", @@ -2673,7 +2673,7 @@ func TestAttributeMultipleProcessWithFiltersExists(t *testing.T) { Tenant: config.CgrConfig().GeneralCfg().DefaultTenant, ID: "ATTR_1_EXISTS", Contexts: []string{utils.MetaSessionS}, - FilterIDs: []string{"*exists:~*req.InitialField:", "*ai:~*req.AnswerTime:2014-07-14T14:25:00Z"}, + FilterIDs: []string{"*exists:~*req.InitialField:", "*ai:*now:2014-07-14T14:25:00Z"}, Attributes: []*Attribute{ { Path: utils.MetaReq + utils.NestingSep + "Field1", @@ -2686,7 +2686,7 @@ func TestAttributeMultipleProcessWithFiltersExists(t *testing.T) { Tenant: config.CgrConfig().GeneralCfg().DefaultTenant, ID: "ATTR_2_EXISTS", Contexts: []string{utils.MetaSessionS}, - FilterIDs: []string{"*exists:~*req.Field1:", "*ai:~*req.AnswerTime:2014-07-14T14:25:00Z"}, + FilterIDs: []string{"*exists:~*req.Field1:", "*ai:*now:2014-07-14T14:25:00Z"}, Attributes: []*Attribute{ { Path: utils.MetaReq + utils.NestingSep + "Field2", @@ -2761,7 +2761,7 @@ func TestAttributeMultipleProcessWithFiltersNotEmpty(t *testing.T) { Tenant: config.CgrConfig().GeneralCfg().DefaultTenant, ID: "ATTR_1_NOTEMPTY", Contexts: []string{utils.MetaSessionS}, - FilterIDs: []string{"*notempty:~*req.InitialField:", "*ai:~*req.AnswerTime:2014-07-14T14:25:00Z"}, + FilterIDs: []string{"*notempty:~*req.InitialField:", "*ai:*now:2014-07-14T14:25:00Z"}, Attributes: []*Attribute{ { Path: utils.MetaReq + utils.NestingSep + "Field1", @@ -2774,7 +2774,7 @@ func TestAttributeMultipleProcessWithFiltersNotEmpty(t *testing.T) { Tenant: config.CgrConfig().GeneralCfg().DefaultTenant, ID: "ATTR_2_NOTEMPTY", Contexts: []string{utils.MetaSessionS}, - FilterIDs: []string{"*notempty:~*req.Field1:", "*ai:~*req.AnswerTime:2014-07-14T14:25:00Z"}, + FilterIDs: []string{"*notempty:~*req.Field1:", "*ai:*now:2014-07-14T14:25:00Z"}, Attributes: []*Attribute{ { Path: utils.MetaReq + utils.NestingSep + "Field2", diff --git a/loaders/loader_test.go b/loaders/loader_test.go index 90ea59e2d..605083cb0 100644 --- a/loaders/loader_test.go +++ b/loaders/loader_test.go @@ -2871,40 +2871,6 @@ true } } -func TestLoaderAttributesAsStructErrConversion(t *testing.T) { - data := engine.NewInternalDB(nil, nil, true) - ldr := &Loader{ - ldrID: "TestLoaderAttributesAsStructErrConversion", - bufLoaderData: map[string][]LoaderData{}, - dm: engine.NewDataManager(data, config.CgrConfig().CacheCfg(), nil), - timezone: "UTC", - } - ldr.dataTpls = map[string][]*config.FCTemplate{ - utils.MetaAttributes: { - {Tag: "ActivationInterval", - Path: "ActivationInterval", - Type: utils.MetaComposed, - Value: config.NewRSRParsersMustCompile("~*req.0", utils.InfieldSep)}, - }, - } - attributeCsv := ` -#ActivationInterval -* * * * * * -` - rdr := io.NopCloser(strings.NewReader(attributeCsv)) - csvRdr := csv.NewReader(rdr) - csvRdr.Comment = '#' - ldr.rdrs = map[string]map[string]*openedCSVFile{ - utils.MetaAttributes: { - utils.AttributesCsv: &openedCSVFile{fileName: utils.AttributesCsv, - rdr: rdr, csvRdr: csvRdr}}, - } - expectedErr := "Unsupported time format" - if err := ldr.processContent(utils.MetaAttributes, utils.EmptyString); err == nil || err.Error() != expectedErr { - t.Errorf("Expected %+v, received %+v", expectedErr, err) - } -} - func TestLoadResourcesAsStructErrType(t *testing.T) { data := engine.NewInternalDB(nil, nil, true) ldr := &Loader{ diff --git a/migrator/attributes.go b/migrator/attributes.go index c9759e1cf..91334fea8 100644 --- a/migrator/attributes.go +++ b/migrator/attributes.go @@ -316,7 +316,7 @@ func (v2AttrPrf v2AttributeProfile) AsAttributeProfile() (attrPrf *v3AttributePr for _, attr := range v2AttrPrf.Attributes { filterIDs := make([]string, 0) //append false translate to if FieldName exist do stuff - if attr.Append == false { + if !attr.Append { filterIDs = append(filterIDs, utils.MetaExists+utils.InInFieldSep+attr.FieldName+utils.InInFieldSep) } //Initial not *any translate to if value of fieldName = initial do stuff @@ -396,11 +396,12 @@ func (v3AttrPrf v3AttributeProfile) AsAttributeProfile() (attrPrf *v4AttributePr func (v4AttrPrf v4AttributeProfile) AsAttributeProfile() (attrPrf *v6AttributeProfile, err error) { attrPrf = &v6AttributeProfile{ - Tenant: v4AttrPrf.Tenant, - ID: v4AttrPrf.ID, - Contexts: v4AttrPrf.Contexts, - FilterIDs: v4AttrPrf.FilterIDs, - Weight: v4AttrPrf.Weight, + Tenant: v4AttrPrf.Tenant, + ID: v4AttrPrf.ID, + Contexts: v4AttrPrf.Contexts, + FilterIDs: v4AttrPrf.FilterIDs, + Weight: v4AttrPrf.Weight, + ActivationInterval: v4AttrPrf.ActivationInterval, } for _, attr := range v4AttrPrf.Attributes { // ToDo:redo this val := attr.Value.GetRule(utils.InfieldSep) @@ -536,16 +537,17 @@ func (m *Migrator) migrateV6ToV7AttributeProfile(v5Attr *v6AttributeProfile) (_ } if v5Attr.ActivationInterval != nil && - (v5Attr.ActivationInterval.ActivationTime.IsZero() || - v5Attr.ActivationInterval.ExpiryTime.IsZero()) { + (!v5Attr.ActivationInterval.ActivationTime.IsZero() || + !v5Attr.ActivationInterval.ExpiryTime.IsZero()) { fltr := "*ai:~*req.AnswerTime:" - if v5Attr.ActivationInterval.ActivationTime.IsZero() { + if !v5Attr.ActivationInterval.ActivationTime.IsZero() { fltr += v5Attr.ActivationInterval.ActivationTime.Format(time.RFC3339) } - fltr += ";" - if v5Attr.ActivationInterval.ExpiryTime.IsZero() { + fltr += "|" + if !v5Attr.ActivationInterval.ExpiryTime.IsZero() { fltr += v5Attr.ActivationInterval.ExpiryTime.Format(time.RFC3339) } + v7Attr.FilterIDs = append(v7Attr.FilterIDs, fltr) } return v7Attr, nil diff --git a/migrator/attributes_test.go b/migrator/attributes_test.go index e6937949f..7c173a4f9 100644 --- a/migrator/attributes_test.go +++ b/migrator/attributes_test.go @@ -233,14 +233,17 @@ func TestV4AttributeProfileAsAttributeProfile(t *testing.T) { }, Weight: 20, } - expTimeStr := cloneExpTime.Format("2006-01-02T15:04:05Z") - attrPrf := &engine.AttributeProfile{ + attrPrf := &v6AttributeProfile{ Tenant: "cgrates.org", ID: "attributeprofile1", Contexts: []string{utils.MetaSessionS}, - FilterIDs: []string{"filter1", "*ai:~*req.AnswerTime:2014-07-14T14:25:00Z;" + expTimeStr}, - Attributes: []*engine.Attribute{ - &engine.Attribute{ + FilterIDs: []string{"filter1"}, + ActivationInterval: &utils.ActivationInterval{ + ActivationTime: time.Date(2014, 7, 14, 14, 25, 0, 0, time.UTC), + ExpiryTime: cloneExpTime, + }, + Attributes: []*v6Attribute{ + &v6Attribute{ Path: utils.MetaReq + utils.NestingSep + "FL1", Type: utils.MetaVariable, Value: config.NewRSRParsersMustCompile("~*req.Category:s/(.*)/${1}_UK_Mobile_Vodafone_GBRVF/", utils.InfieldSep), @@ -421,13 +424,17 @@ func TestAsAttributeProfileV5(t *testing.T) { Weight: 20, } - eOut := &engine.AttributeProfile{ + eOut := &v6AttributeProfile{ Tenant: "cgrates.org", ID: "attributeprofile1", Contexts: []string{utils.MetaSessionS}, - FilterIDs: []string{"filter1", "*ai:~*req.AnswerTime:2014-07-14T14:25:00Z;2014-04-18T14:26:00Z"}, - Attributes: []*engine.Attribute{ - &engine.Attribute{ + FilterIDs: []string{"filter1"}, + ActivationInterval: &utils.ActivationInterval{ + ActivationTime: time.Date(2014, 7, 14, 14, 25, 0, 0, time.UTC), + ExpiryTime: time.Date(2020, 4, 18, 14, 25, 0, 0, time.UTC), + }, + Attributes: []*v6Attribute{ + &v6Attribute{ FilterIDs: []string{"*string:FL1:In1"}, Path: utils.MetaReq + utils.NestingSep + "FL1", Type: utils.MetaVariable, @@ -495,3 +502,74 @@ func TestAsAttributeProfileV1To4(t *testing.T) { } } + +func TestAttributesMigrateV6ToV7AttributeProfileNilPrf(t *testing.T) { + var v6AttrPrf *v6AttributeProfile + cfg := config.NewDefaultCGRConfig() + dataDB := engine.NewInternalDB(nil, nil, true) + dm := engine.NewDataManager(dataDB, cfg.CacheCfg(), nil) + m := &Migrator{ + dmIN: newInternalMigrator(dm), + } + + experr := utils.ErrNotImplemented + v7AttrPrf, err := m.migrateV6ToV7AttributeProfile(v6AttrPrf) + + if err == nil || err != experr { + t.Fatalf("\nexpected: <%+v>, \nreceived: <%+v>", experr, err) + } + + if v7AttrPrf != nil { + t.Errorf("\nexpected: <%+v>, \nreceived: <%+v>", nil, v7AttrPrf) + } +} + +func TestAttributesMigrateV6ToV7AttributeProfile2(t *testing.T) { + v6Attr := &v6AttributeProfile{ + Tenant: "cgrates.org", + ID: "ATTR_1001_SESSIONAUTH", + Contexts: []string{utils.MetaSessionS}, + FilterIDs: []string{"filter1"}, + ActivationInterval: &utils.ActivationInterval{ + ActivationTime: time.Date(2014, 7, 14, 14, 35, 0, 0, time.UTC), + ExpiryTime: time.Date(2014, 7, 14, 14, 36, 0, 0, time.UTC), + }, + Attributes: []*v6Attribute{ + { + Path: utils.MetaReq + utils.NestingSep + "FL1", + Type: utils.MetaVariable, + Value: config.NewRSRParsersMustCompile("~*req.Category:s/(.*)/${1}_UK_Mobile_Vodafone_GBRVF/", utils.InfieldSep), + }, + }, + Weight: 20, + } + cfg := config.NewDefaultCGRConfig() + dataDB := engine.NewInternalDB(nil, nil, true) + dm := engine.NewDataManager(dataDB, cfg.CacheCfg(), nil) + m := &Migrator{ + dmIN: newInternalMigrator(dm), + } + + exp := &engine.AttributeProfile{ + Tenant: "cgrates.org", + ID: "ATTR_1001_SESSIONAUTH", + Contexts: []string{utils.MetaSessionS}, + FilterIDs: []string{"filter1", "*ai:~*req.AnswerTime:2014-07-14T14:35:00Z|2014-07-14T14:36:00Z"}, + Attributes: []*engine.Attribute{ + { + Path: utils.MetaReq + utils.NestingSep + "FL1", + Type: utils.MetaVariable, + Value: config.NewRSRParsersMustCompile("~*req.Category:s/(.*)/${1}_UK_Mobile_Vodafone_GBRVF/", utils.InfieldSep), + }, + }, + Weight: 20, + } + + v7Attr, err := m.migrateV6ToV7AttributeProfile(v6Attr) + if err != nil { + t.Fatalf("\nexpected: <%+v>, \nreceived: <%+v>", nil, err) + } + if !reflect.DeepEqual(v7Attr, exp) { + t.Errorf("\nexpected: <%+v>, \nreceived: <%+v>", utils.ToJSON(exp), utils.ToJSON(v7Attr)) + } +}