From 1d168b196e9cec5dcf4f79c0ae8639198a3aac6b Mon Sep 17 00:00:00 2001 From: ionutboangiu Date: Thu, 9 Sep 2021 10:30:00 +0300 Subject: [PATCH] Add ProcessRuns and ProfileRuns to opts struct in attributes --- apis/config_it_test.go | 22 ++++++------- apis/config_test.go | 21 +++++++------ config/attributescfg.go | 60 ++++++++++++++++++++++++++++-------- config/attributescfg_test.go | 28 ++++++++--------- config/config.go | 1 + config/config_it_test.go | 8 ++--- config/config_json_test.go | 6 ++-- config/config_test.go | 40 ++++++++++++------------ config/configsanity.go | 5 +-- config/configsanity_test.go | 4 +-- config/routescfg.go | 45 +++++++++++++++------------ engine/attributes.go | 12 +++----- utils/consts.go | 10 +++--- 13 files changed, 151 insertions(+), 111 deletions(-) diff --git a/apis/config_it_test.go b/apis/config_it_test.go index 36767cf29..37a21930b 100644 --- a/apis/config_it_test.go +++ b/apis/config_it_test.go @@ -154,7 +154,7 @@ func testCfgGetConfig(t *testing.T) { "stats_conns": []string{"*localhost"}, "suffix_indexed_fields": []string{}, utils.OptsCfg: map[string]interface{}{ - utils.OptsAttributesProcessRuns: float64(1), + utils.MetaProcessRunsCfg: 1, }, }, } @@ -190,7 +190,7 @@ func testCfgSetGetConfig(t *testing.T) { "stats_conns": []string{"*internal"}, "suffix_indexed_fields": []string{}, utils.OptsCfg: map[string]interface{}{ - utils.OptsAttributesProcessRuns: 2, + utils.MetaProcessRunsCfg: 2, }, }, }, @@ -213,7 +213,7 @@ func testCfgSetGetConfig(t *testing.T) { "stats_conns": []string{"*internal"}, "suffix_indexed_fields": []string{}, utils.OptsCfg: map[string]interface{}{ - utils.OptsAttributesProcessRuns: float64(2), + utils.MetaProcessRunsCfg: 2, }, }, } @@ -430,7 +430,7 @@ func testCfgGetConfigStore(t *testing.T) { Prefix_indexed_fields: nil, Suffix_indexed_fields: nil, Nested_fields: nil, - Opts: make(map[string]interface{}), + Opts: &config.AttributesOptsJson{}, } if !reflect.DeepEqual(attr, expected) { t.Errorf("\nExpected <%+v>, \nReceived <%+v>", utils.ToJSON(expected), utils.ToJSON(attr)) @@ -455,7 +455,7 @@ func testCfgSetGetConfigStore(t *testing.T) { "stats_conns": []string{"*internal"}, "suffix_indexed_fields": []string{}, utils.OptsCfg: map[string]interface{}{ - utils.OptsAttributesProcessRuns: 2, + utils.MetaProcessRunsCfg: 2, }, }, }, @@ -478,7 +478,7 @@ func testCfgSetGetConfigStore(t *testing.T) { "stats_conns": []string{"*internal"}, "suffix_indexed_fields": []string{}, utils.OptsCfg: map[string]interface{}{ - utils.OptsAttributesProcessRuns: 2, + utils.MetaProcessRunsCfg: 2, }, }, } @@ -512,8 +512,8 @@ func testCfgGetConfigStoreAgain(t *testing.T) { Prefix_indexed_fields: nil, Suffix_indexed_fields: nil, Nested_fields: nil, - Opts: map[string]interface{}{ - utils.OptsAttributesProcessRuns: float64(2), + Opts: &config.AttributesOptsJson{ + ProcessRuns: utils.IntPointer(2), }, } if !reflect.DeepEqual(attr, expected) { @@ -532,8 +532,8 @@ func testCfgMdfSectConfigStore(t *testing.T) { Prefix_indexed_fields: nil, Suffix_indexed_fields: nil, Nested_fields: nil, - Opts: map[string]interface{}{ - utils.OptsAttributesProcessRuns: float64(2), + Opts: &config.AttributesOptsJson{ + ProcessRuns: utils.IntPointer(2), }, } err := connDb.SetSection(context.Background(), "attributes", attrSect) @@ -572,7 +572,7 @@ func testCfgGetAfterReloadStore(t *testing.T) { "stats_conns": []string{"*internal"}, "suffix_indexed_fields": []string{}, utils.OptsCfg: map[string]interface{}{ - utils.OptsAttributesProcessRuns: 2, + utils.MetaProcessRunsCfg: 2, }, }, } diff --git a/apis/config_test.go b/apis/config_test.go index 5993b358c..80eb921a0 100644 --- a/apis/config_test.go +++ b/apis/config_test.go @@ -74,9 +74,9 @@ func TestConfigSetGetConfig(t *testing.T) { "stats_conns": []string{"*localhost"}, "suffix_indexed_fields": []string{}, utils.OptsCfg: map[string]interface{}{ - utils.OptsAttributesProcessRuns: float64(1), + utils.MetaProcessRunsCfg: 1, + utils.MetaProfileRunsCfg: 0, }, - utils.ProfileRunsCfg: 0, }, } if err != nil { @@ -110,7 +110,7 @@ func TestConfigSetGetReloadConfig(t *testing.T) { "stats_conns": []string{"*internal"}, "suffix_indexed_fields": []string{}, utils.OptsCfg: map[string]interface{}{ - utils.OptsAttributesProcessRuns: 2, + utils.MetaProcessRunsCfg: 2, }, }, }, @@ -141,16 +141,17 @@ func TestConfigSetGetReloadConfig(t *testing.T) { "stats_conns": []string{"*localhost"}, "suffix_indexed_fields": []string{}, utils.OptsCfg: map[string]interface{}{ - utils.OptsAttributesProcessRuns: float64(1), + utils.MetaProcessRunsCfg: 2, + utils.MetaProfileRunsCfg: 0, }, - utils.ProfileRunsCfg: 0, }, } if errGet != nil { t.Errorf("Expected <%+v>, \nReceived <%+v>", nil, errGet) } if !reflect.DeepEqual(expectedGet, replyGet) { - t.Errorf("Expected <%+v>, \nReceived <%+v>", expectedGet, replyGet) + t.Errorf("Expected <%+v>, \nReceived <%+v>", + utils.ToJSON(expectedGet), utils.ToJSON(replyGet)) } argsRld := &config.ReloadArgs{ DryRun: true, @@ -182,16 +183,16 @@ func TestConfigSetGetReloadConfig(t *testing.T) { "stats_conns": []string{"*localhost"}, "suffix_indexed_fields": []string{}, utils.OptsCfg: map[string]interface{}{ - utils.OptsAttributesProcessRuns: float64(1), + utils.MetaProcessRunsCfg: 2, + utils.MetaProfileRunsCfg: 0, }, - utils.ProfileRunsCfg: 0, }, } if errGetRld != nil { t.Errorf("Expected <%+v>, \nReceived <%+v>", nil, errGetRld) } if !reflect.DeepEqual(expectedGetRld, replyGetRld) { - t.Errorf("Expected <%+v>, \nReceived <%+v>", expectedGetRld, replyGetRld) + t.Errorf("Expected <%+v>, \nReceived <%+v>", utils.ToJSON(expectedGetRld), utils.ToJSON(replyGetRld)) } } @@ -227,7 +228,7 @@ func TestConfigGetSetConfigFromJSONErr(t *testing.T) { } var replyGet string errGet := rlcCfg.GetConfigAsJSON(context.Background(), argsGet, &replyGet) - expectedGet := `{"attributes":{"accounts_conns":["*localhost"],"enabled":true,"indexed_selects":true,"nested_fields":false,"opts":{"*processRuns":1},"prefix_indexed_fields":[],"profile_runs":0,"resources_conns":["*localhost"],"stats_conns":["*localhost"],"suffix_indexed_fields":[]}}` + expectedGet := `{"attributes":{"accounts_conns":["*localhost"],"enabled":true,"indexed_selects":true,"nested_fields":false,"opts":{"*processRuns":2},"prefix_indexed_fields":[],"profile_runs":0,"resources_conns":["*localhost"],"stats_conns":["*localhost"],"suffix_indexed_fields":[]}}` if err != nil { t.Errorf("Expected <%+v>, \nReceived <%+v>", nil, errGet) } diff --git a/config/attributescfg.go b/config/attributescfg.go index bd1da883d..585669d2d 100644 --- a/config/attributescfg.go +++ b/config/attributescfg.go @@ -20,6 +20,11 @@ package config import "github.com/cgrates/cgrates/utils" +type AttributesOpts struct { + ProcessRuns int + ProfileRuns int +} + // AttributeSCfg is the configuration of attribute service type AttributeSCfg struct { Enabled bool @@ -31,8 +36,21 @@ type AttributeSCfg struct { PrefixIndexedFields *[]string SuffixIndexedFields *[]string NestedFields bool - ProfileRuns int - DefaultOpts map[string]interface{} + Opts *AttributesOpts +} + +func (attrOpts *AttributesOpts) loadFromJSONCfg(jsnCfg *AttributesOptsJson) (err error) { + if jsnCfg == nil { + return nil + } + if jsnCfg.ProcessRuns != nil { + attrOpts.ProcessRuns = *jsnCfg.ProcessRuns + } + if jsnCfg.ProfileRuns != nil { + attrOpts.ProfileRuns = *jsnCfg.ProfileRuns + } + + return nil } func (alS *AttributeSCfg) loadFromJSONCfg(jsnCfg *AttributeSJsonCfg) (err error) { @@ -63,26 +81,26 @@ func (alS *AttributeSCfg) loadFromJSONCfg(jsnCfg *AttributeSJsonCfg) (err error) if jsnCfg.Suffix_indexed_fields != nil { alS.SuffixIndexedFields = utils.SliceStringPointer(utils.CloneStringSlice(*jsnCfg.Suffix_indexed_fields)) } - if jsnCfg.Profile_runs != nil { - alS.ProfileRuns = *jsnCfg.Profile_runs - } if jsnCfg.Nested_fields != nil { alS.NestedFields = *jsnCfg.Nested_fields } if jsnCfg.Opts != nil { - alS.DefaultOpts = jsnCfg.Opts + alS.Opts.loadFromJSONCfg(jsnCfg.Opts) } return } // AsMapInterface returns the config as a map[string]interface{} func (alS *AttributeSCfg) AsMapInterface() (initialMP map[string]interface{}) { + opts := map[string]interface{}{ + utils.MetaProcessRunsCfg: alS.Opts.ProcessRuns, + utils.MetaProfileRunsCfg: alS.Opts.ProfileRuns, + } initialMP = map[string]interface{}{ utils.EnabledCfg: alS.Enabled, utils.IndexedSelectsCfg: alS.IndexedSelects, - utils.ProfileRunsCfg: alS.ProfileRuns, utils.NestedFieldsCfg: alS.NestedFields, - utils.OptsCfg: alS.DefaultOpts, + utils.OptsCfg: opts, } if alS.StringIndexedFields != nil { initialMP[utils.StringIndexedFieldsCfg] = utils.CloneStringSlice(*alS.StringIndexedFields) @@ -112,8 +130,7 @@ func (alS AttributeSCfg) Clone() (cln *AttributeSCfg) { Enabled: alS.Enabled, IndexedSelects: alS.IndexedSelects, NestedFields: alS.NestedFields, - DefaultOpts: alS.DefaultOpts, - ProfileRuns: alS.ProfileRuns, + Opts: alS.Opts, } if alS.ResourceSConns != nil { cln.ResourceSConns = utils.CloneStringSlice(alS.ResourceSConns) @@ -137,6 +154,11 @@ func (alS AttributeSCfg) Clone() (cln *AttributeSCfg) { return } +type AttributesOptsJson struct { + ProcessRuns *int `json:"*processRuns"` + ProfileRuns *int `json:"*profileRuns"` +} + // Attribute service config section type AttributeSJsonCfg struct { Enabled *bool @@ -148,8 +170,20 @@ type AttributeSJsonCfg struct { Prefix_indexed_fields *[]string Suffix_indexed_fields *[]string Nested_fields *bool // applies when indexed fields is not defined - Profile_runs *int - Opts map[string]interface{} + Opts *AttributesOptsJson +} + +func diffAttributesOptsJsonCfg(d *AttributesOptsJson, v1, v2 *AttributesOpts) *AttributesOptsJson { + if d == nil { + d = new(AttributesOptsJson) + } + if v1.ProcessRuns != v2.ProcessRuns { + d.ProcessRuns = utils.IntPointer(v2.ProcessRuns) + } + if v1.ProfileRuns != v2.ProfileRuns { + d.ProfileRuns = utils.IntPointer(v2.ProfileRuns) + } + return d } func diffAttributeSJsonCfg(d *AttributeSJsonCfg, v1, v2 *AttributeSCfg) *AttributeSJsonCfg { @@ -177,7 +211,7 @@ func diffAttributeSJsonCfg(d *AttributeSJsonCfg, v1, v2 *AttributeSCfg) *Attribu if v1.NestedFields != v2.NestedFields { d.Nested_fields = utils.BoolPointer(v2.NestedFields) } - d.Opts = diffMap(d.Opts, v1.DefaultOpts, v2.DefaultOpts) + d.Opts = diffAttributesOptsJsonCfg(d.Opts, v1.Opts, v2.Opts) return d } diff --git a/config/attributescfg_test.go b/config/attributescfg_test.go index 1b8932f3a..ac9883cda 100644 --- a/config/attributescfg_test.go +++ b/config/attributescfg_test.go @@ -46,8 +46,8 @@ func TestAttributeSCfgloadFromJsonCfg(t *testing.T) { PrefixIndexedFields: &[]string{"*req.index1", "*req.index2"}, SuffixIndexedFields: &[]string{"*req.index1"}, NestedFields: true, - DefaultOpts: map[string]interface{}{ - utils.OptsAttributesProcessRuns: float64(1), + Opts: &AttributesOpts{ + ProcessRuns: 1, }, } jsnCfg := NewDefaultCGRConfig() @@ -79,12 +79,12 @@ func TestAttributeSCfgAsMapInterface(t *testing.T) { utils.AccountSConnsCfg: []string{utils.MetaInternal}, utils.StringIndexedFieldsCfg: []string{"*req.index1"}, utils.PrefixIndexedFieldsCfg: []string{"*req.index1", "*req.index2"}, - utils.ProfileRunsCfg: 0, utils.IndexedSelectsCfg: true, utils.NestedFieldsCfg: false, utils.SuffixIndexedFieldsCfg: []string{}, utils.OptsCfg: map[string]interface{}{ - utils.OptsAttributesProcessRuns: float64(3), + utils.MetaProcessRunsCfg: 3, + utils.MetaProfileRunsCfg: 0, }, } if cgrCfg, err := NewCGRConfigFromJSONStringWithDefaults(cfgJSONStr); err != nil { @@ -115,9 +115,9 @@ func TestAttributeSCfgAsMapInterface2(t *testing.T) { utils.SuffixIndexedFieldsCfg: []string{"*req.index1", "*req.index2"}, utils.NestedFieldsCfg: true, utils.OptsCfg: map[string]interface{}{ - utils.OptsAttributesProcessRuns: float64(7), + utils.MetaProcessRunsCfg: 7, + utils.MetaProfileRunsCfg: 0, }, - utils.ProfileRunsCfg: 0, } if cgrCfg, err := NewCGRConfigFromJSONStringWithDefaults(cfgJSONStr); err != nil { t.Error(err) @@ -142,9 +142,9 @@ func TestAttributeSCfgAsMapInterface3(t *testing.T) { utils.SuffixIndexedFieldsCfg: []string{}, utils.NestedFieldsCfg: false, utils.OptsCfg: map[string]interface{}{ - utils.OptsAttributesProcessRuns: float64(1), + utils.MetaProcessRunsCfg: 1, + utils.MetaProfileRunsCfg: 0, }, - utils.ProfileRunsCfg: 0, } if conv, err := NewCGRConfigFromJSONStringWithDefaults(myJSONStr); err != nil { t.Error(err) @@ -202,8 +202,8 @@ func TestDiffAttributeSJsonCfg(t *testing.T) { PrefixIndexedFields: &[]string{}, SuffixIndexedFields: &[]string{}, NestedFields: true, - DefaultOpts: map[string]interface{}{ - utils.OptsAttributesProcessRuns: float64(1), + Opts: &AttributesOpts{ + ProcessRuns: 1, }, } @@ -217,8 +217,8 @@ func TestDiffAttributeSJsonCfg(t *testing.T) { PrefixIndexedFields: nil, SuffixIndexedFields: nil, NestedFields: false, - DefaultOpts: map[string]interface{}{ - utils.OptsAttributesProcessRuns: float64(1), + Opts: &AttributesOpts{ + ProcessRuns: 1, }, } @@ -232,7 +232,7 @@ func TestDiffAttributeSJsonCfg(t *testing.T) { Prefix_indexed_fields: nil, Suffix_indexed_fields: nil, Nested_fields: utils.BoolPointer(false), - Opts: map[string]interface{}{}, + Opts: &AttributesOptsJson{}, } rcv := diffAttributeSJsonCfg(d, v1, v2) @@ -242,7 +242,7 @@ func TestDiffAttributeSJsonCfg(t *testing.T) { v2_2 := v1 expected2 := &AttributeSJsonCfg{ - Opts: map[string]interface{}{}, + Opts: &AttributesOptsJson{}, } rcv = diffAttributeSJsonCfg(d, v1, v2_2) if !reflect.DeepEqual(rcv, expected2) { diff --git a/config/config.go b/config/config.go index 1c083fe97..2c494f6a3 100644 --- a/config/config.go +++ b/config/config.go @@ -142,6 +142,7 @@ func newCGRConfig(config []byte) (cfg *CGRConfig, err error) { cfg.radiusAgentCfg.ClientSecrets = make(map[string]string) cfg.dnsAgentCfg = new(DNSAgentCfg) cfg.attributeSCfg = new(AttributeSCfg) + cfg.AttributeSCfg().Opts = &AttributesOpts{} cfg.chargerSCfg = new(ChargerSCfg) cfg.resourceSCfg = new(ResourceSConfig) cfg.statsCfg = new(StatSCfg) diff --git a/config/config_it_test.go b/config/config_it_test.go index 7073a48c9..da89d3060 100644 --- a/config/config_it_test.go +++ b/config/config_it_test.go @@ -155,8 +155,8 @@ func testCGRConfigReloadAttributeS(t *testing.T) { PrefixIndexedFields: &[]string{}, SuffixIndexedFields: &[]string{}, IndexedSelects: true, - DefaultOpts: map[string]interface{}{ - utils.OptsAttributesProcessRuns: 1., + Opts: &AttributesOpts{ + ProcessRuns: 1., }, } if !reflect.DeepEqual(expAttr, cfg.AttributeSCfg()) { @@ -193,8 +193,8 @@ func testCGRConfigReloadAttributeSWithDB(t *testing.T) { PrefixIndexedFields: &[]string{}, SuffixIndexedFields: &[]string{}, IndexedSelects: true, - DefaultOpts: map[string]interface{}{ - utils.OptsAttributesProcessRuns: 1., + Opts: &AttributesOpts{ + ProcessRuns: 1., }, } if !reflect.DeepEqual(expAttr, cfg.AttributeSCfg()) { diff --git a/config/config_json_test.go b/config/config_json_test.go index 2a0b1c908..659e17c1d 100644 --- a/config/config_json_test.go +++ b/config/config_json_test.go @@ -753,10 +753,10 @@ func TestDfAttributeServJsonCfg(t *testing.T) { Prefix_indexed_fields: &[]string{}, Suffix_indexed_fields: &[]string{}, Nested_fields: utils.BoolPointer(false), - Opts: map[string]interface{}{ - utils.OptsAttributesProcessRuns: float64(1), + Opts: &AttributesOptsJson{ + ProcessRuns: utils.IntPointer(1), + ProfileRuns: utils.IntPointer(0), }, - Profile_runs: utils.IntPointer(0), } dfCgrJSONCfg, err := NewCgrJsonCfgFromBytes([]byte(CGRATES_CFG_JSON)) if err != nil { diff --git a/config/config_test.go b/config/config_test.go index d52cfe40a..d464a32c5 100644 --- a/config/config_test.go +++ b/config/config_test.go @@ -1849,8 +1849,8 @@ func TestAttributeSConfig(t *testing.T) { PrefixIndexedFields: &[]string{}, SuffixIndexedFields: &[]string{}, NestedFields: false, - DefaultOpts: map[string]interface{}{ - utils.OptsAttributesProcessRuns: float64(1), + Opts: &AttributesOpts{ + ProcessRuns: 1, }, } cgrConfig := NewDefaultCGRConfig() @@ -4157,9 +4157,9 @@ func TestV1GetConfigAttribute(t *testing.T) { utils.SuffixIndexedFieldsCfg: []string{}, utils.NestedFieldsCfg: false, utils.OptsCfg: map[string]interface{}{ - utils.OptsAttributesProcessRuns: float64(1), + utils.MetaProcessRunsCfg: 1, + utils.MetaProfileRunsCfg: 0, }, - utils.ProfileRunsCfg: 0, }, } cfgCgr := NewDefaultCGRConfig() @@ -5939,8 +5939,8 @@ func TestSetCfgInDb(t *testing.T) { StringIndexedFields: &[]string{"field1"}, SuffixIndexedFields: &[]string{"field1"}, PrefixIndexedFields: &[]string{"field1"}, - DefaultOpts: map[string]interface{}{ - utils.OptsAttributesProcessRuns: float64(2), + Opts: &AttributesOpts{ + ProcessRuns: 2, }, NestedFields: true, } @@ -5957,8 +5957,8 @@ func TestSetCfgInDb(t *testing.T) { String_indexed_fields: &[]string{"field2"}, Suffix_indexed_fields: &[]string{"field2"}, Prefix_indexed_fields: &[]string{"field2"}, - Opts: map[string]interface{}{ - utils.OptsAttributesProcessRuns: float64(3), + Opts: &AttributesOptsJson{ + ProcessRuns: utils.IntPointer(3), }, Nested_fields: utils.BoolPointer(false), }, @@ -5973,8 +5973,8 @@ func TestSetCfgInDb(t *testing.T) { String_indexed_fields: &[]string{"field2"}, Suffix_indexed_fields: &[]string{"field2"}, Prefix_indexed_fields: &[]string{"field2"}, - Opts: map[string]interface{}{ - utils.OptsAttributesProcessRuns: float64(3), + Opts: &AttributesOptsJson{ + ProcessRuns: utils.IntPointer(3), }, Nested_fields: utils.BoolPointer(false), } @@ -5988,7 +5988,7 @@ func TestSetCfgInDb(t *testing.T) { t.Error(err) } if !reflect.DeepEqual(expected, rcv) { - t.Errorf("Expected %v \n but received \n %v", expected, rcv) + t.Errorf("Expected %v \n but received \n %v", utils.ToJSON(expected), utils.ToJSON(rcv)) } } @@ -6005,8 +6005,8 @@ func TestSetNilCfgInDb(t *testing.T) { StringIndexedFields: &[]string{"field1"}, SuffixIndexedFields: &[]string{"field1"}, PrefixIndexedFields: &[]string{"field1"}, - DefaultOpts: map[string]interface{}{ - utils.OptsAttributesProcessRuns: float64(2), + Opts: &AttributesOpts{ + ProcessRuns: 2, }, NestedFields: true, } @@ -6019,7 +6019,7 @@ func TestSetNilCfgInDb(t *testing.T) { }, } expected := &AttributeSJsonCfg{ - Opts: make(map[string]interface{}), + Opts: &AttributesOptsJson{}, } var reply string if err := cfg.V1SetConfig(context.Background(), args, &reply); err != nil { @@ -6048,8 +6048,8 @@ func TestReloadCfgInDb(t *testing.T) { StringIndexedFields: &[]string{"field1"}, SuffixIndexedFields: &[]string{"field1"}, PrefixIndexedFields: &[]string{"field1"}, - DefaultOpts: map[string]interface{}{ - utils.OptsAttributesProcessRuns: float64(2), + Opts: &AttributesOpts{ + ProcessRuns: 2, }, NestedFields: true, } @@ -6066,8 +6066,8 @@ func TestReloadCfgInDb(t *testing.T) { String_indexed_fields: &[]string{"field2"}, Suffix_indexed_fields: &[]string{"field2"}, Prefix_indexed_fields: &[]string{"field2"}, - Opts: map[string]interface{}{ - utils.OptsAttributesProcessRuns: float64(3), + Opts: &AttributesOptsJson{ + ProcessRuns: utils.IntPointer(3), }, Nested_fields: utils.BoolPointer(false), } @@ -6081,8 +6081,8 @@ func TestReloadCfgInDb(t *testing.T) { StringIndexedFields: &[]string{"field2"}, SuffixIndexedFields: &[]string{"field2"}, PrefixIndexedFields: &[]string{"field2"}, - DefaultOpts: map[string]interface{}{ - utils.OptsAttributesProcessRuns: float64(3), + Opts: &AttributesOpts{ + ProcessRuns: 3, }, NestedFields: false, } diff --git a/config/configsanity.go b/config/configsanity.go index 86f785bdb..6461a9654 100644 --- a/config/configsanity.go +++ b/config/configsanity.go @@ -544,10 +544,7 @@ func (cfg *CGRConfig) checkConfigSanity() error { } if cfg.attributeSCfg.Enabled { - processRuns, err := utils.IfaceAsTInt64(cfg.attributeSCfg.DefaultOpts[utils.OptsAttributesProcessRuns]) - if err != nil { - return fmt.Errorf("<%s> invalid type", utils.AttributeS) - } + processRuns := cfg.attributeSCfg.Opts.ProcessRuns if processRuns < 1 { return fmt.Errorf("<%s> processRuns needs to be bigger than 0", utils.AttributeS) } diff --git a/config/configsanity_test.go b/config/configsanity_test.go index 74c111504..f35f587d8 100644 --- a/config/configsanity_test.go +++ b/config/configsanity_test.go @@ -987,8 +987,8 @@ func TestConfigSanityAttributesCfg(t *testing.T) { cfg.attributeSCfg = &AttributeSCfg{ Enabled: true, - DefaultOpts: map[string]interface{}{ - utils.OptsAttributesProcessRuns: float64(0), + Opts: &AttributesOpts{ + ProcessRuns: 0, }, } expected := " processRuns needs to be bigger than 0" diff --git a/config/routescfg.go b/config/routescfg.go index 3d1a465ab..37f6ece63 100644 --- a/config/routescfg.go +++ b/config/routescfg.go @@ -232,6 +232,31 @@ type RouteSJsonCfg struct { Opts *RoutesOptsJson } +func diffRoutesOptsJsonCfg(d *RoutesOptsJson, v1, v2 *RoutesOpts) *RoutesOptsJson { + if d == nil { + d = new(RoutesOptsJson) + } + if v1.Context != v2.Context { + d.Context = utils.StringPointer(v2.Context) + } + if v1.Limit != v2.Limit { + d.Limit = v2.Limit + } + if v1.Offset != v2.Offset { + d.Offset = v2.Offset + } + if v1.MaxCost != v2.MaxCost { + d.MaxCost = &v2.MaxCost + } + if v1.IgnoreErrors != v2.IgnoreErrors { + d.IgnoreErrors = utils.BoolPointer(v2.IgnoreErrors) + } + if v1.ProfileCount != v2.ProfileCount { + d.ProfileCount = utils.Float64Pointer(v2.ProfileCount) + } + return d +} + func diffRouteSJsonCfg(d *RouteSJsonCfg, v1, v2 *RouteSCfg) *RouteSJsonCfg { if d == nil { d = new(RouteSJsonCfg) @@ -266,24 +291,6 @@ func diffRouteSJsonCfg(d *RouteSJsonCfg, v1, v2 *RouteSCfg) *RouteSJsonCfg { if v1.DefaultRatio != v2.DefaultRatio { d.Default_ratio = utils.IntPointer(v2.DefaultRatio) } - d.Opts = &RoutesOptsJson{} - if v1.Opts.Context != v2.Opts.Context { - d.Opts.Context = utils.StringPointer(v2.Opts.Context) - } - if v1.Opts.Limit != v2.Opts.Limit { - d.Opts.Limit = v2.Opts.Limit - } - if v1.Opts.Offset != v2.Opts.Offset { - d.Opts.Offset = v2.Opts.Offset - } - if v1.Opts.MaxCost != v2.Opts.MaxCost { - d.Opts.MaxCost = &v2.Opts.MaxCost - } - if v1.Opts.IgnoreErrors != v2.Opts.IgnoreErrors { - d.Opts.IgnoreErrors = utils.BoolPointer(v2.Opts.IgnoreErrors) - } - if v1.Opts.ProfileCount != v2.Opts.ProfileCount { - d.Opts.ProfileCount = utils.Float64Pointer(v2.Opts.ProfileCount) - } + d.Opts = diffRoutesOptsJsonCfg(d.Opts, v1.Opts, v2.Opts) return d } diff --git a/engine/attributes.go b/engine/attributes.go index badf19728..d4c00af3f 100644 --- a/engine/attributes.go +++ b/engine/attributes.go @@ -265,16 +265,14 @@ func (alS *AttributeService) V1ProcessEvent(ctx *context.Context, args *AttrArgs tnt = alS.cgrcfg.GeneralCfg().DefaultTenant } - var processRuns int64 + processRuns := int64(alS.cgrcfg.AttributeSCfg().Opts.ProcessRuns) if v, has := args.APIOpts[utils.OptsAttributesProcessRuns]; has { if processRuns, err = utils.IfaceAsTInt64(v); err != nil { return } - } else if processRuns, err = utils.IfaceAsTInt64(alS.cgrcfg.AttributeSCfg().DefaultOpts[utils.OptsAttributesProcessRuns]); err != nil { - return } - profileRuns := alS.cgrcfg.AttributeSCfg().ProfileRuns + profileRuns := alS.cgrcfg.AttributeSCfg().Opts.ProfileRuns if opt, has := args.APIOpts[utils.OptsAttributesProfileRuns]; has { var val int64 if val, err = utils.IfaceAsTInt64(opt); err != nil { @@ -287,8 +285,8 @@ func (alS *AttributeService) V1ProcessEvent(ctx *context.Context, args *AttrArgs processedPrfNo := make(map[string]int) eNV := utils.MapStorage{ utils.MetaVars: utils.MapStorage{ - utils.OptsAttributesProcessRuns: 0, - utils.MetaProcessedProfileIDs: processedPrf, + utils.MetaProcessRunsCfg: 0, + utils.MetaProcessedProfileIDs: processedPrf, }, utils.MetaTenant: tnt, } @@ -305,7 +303,7 @@ func (alS *AttributeService) V1ProcessEvent(ctx *context.Context, args *AttrArgs dynDP := newDynamicDP(ctx, alS.cgrcfg.AttributeSCfg().ResourceSConns, alS.cgrcfg.AttributeSCfg().StatSConns, alS.cgrcfg.AttributeSCfg().AccountSConns, args.Tenant, eNV) for i := int64(0); i < processRuns; i++ { - (eNV[utils.MetaVars].(utils.MapStorage))[utils.OptsAttributesProcessRuns] = i + 1 + (eNV[utils.MetaVars].(utils.MapStorage))[utils.MetaProcessRunsCfg] = i + 1 var evRply *AttrSProcessEventReply evRply, err = alS.processEvent(ctx, tnt, args, eNV, dynDP, lastID, processedPrfNo, profileRuns) if err != nil { diff --git a/utils/consts.go b/utils/consts.go index 821d17449..2d1dbac88 100644 --- a/utils/consts.go +++ b/utils/consts.go @@ -1869,9 +1869,11 @@ const ( ClientDictionariesCfg = "client_dictionaries" // AttributeSCfg - IndexedSelectsCfg = "indexed_selects" - ProfileRunsCfg = "profile_runs" - NestedFieldsCfg = "nested_fields" + IndexedSelectsCfg = "indexed_selects" + ProfileRunsCfg = "profile_runs" + NestedFieldsCfg = "nested_fields" + MetaProcessRunsCfg = "*processRuns" + MetaProfileRunsCfg = "*profileRuns" // ChargerSCfg StoreIntervalCfg = "store_interval" @@ -2184,8 +2186,8 @@ const ( OptsContext = "*context" Subsys = "*subsys" MetaMethod = "*reqMethod" - OptsAttributesProcessRuns = "*processRuns" OptsAttributesProfileRuns = "*profileRuns" + OptsAttributesProcessRuns = "*attrProcessRuns" MetaEventType = "*eventType" EventType = "EventType" SchedulerInit = "SchedulerInit"