From df4756729f856fbc5dad26c7efdf30b13502dc6d Mon Sep 17 00:00:00 2001 From: adragusin Date: Mon, 27 Apr 2020 17:57:44 +0300 Subject: [PATCH] Updated some AsMapInterface methods/added tests for them --- config/apiercfg.go | 40 +++++++++++++-- config/dispatchercfg.go | 36 ++++++++++++-- config/erscfg_test.go | 94 +++++++++++++++++++++++++++++++++++ config/loadercgrcfg.go | 2 +- config/loadercgrcfg_test.go | 45 +++++++++++++++++ config/mailercfg_test.go | 53 ++++++++++++++++++++ config/migratorcfg_test.go | 98 +++++++++++++++++++++++++++++++++++++ utils/consts.go | 38 +++++++------- 8 files changed, 378 insertions(+), 28 deletions(-) diff --git a/config/apiercfg.go b/config/apiercfg.go index 439929f04..1d36aee9e 100644 --- a/config/apiercfg.go +++ b/config/apiercfg.go @@ -18,7 +18,11 @@ along with this program. If not, see package config -import "github.com/cgrates/cgrates/utils" +import ( + "strings" + + "github.com/cgrates/cgrates/utils" +) // ApierCfg is the configuration of Apier service type ApierCfg struct { @@ -73,11 +77,39 @@ func (aCfg *ApierCfg) loadFromJsonCfg(jsnCfg *ApierJsonCfg) (err error) { } func (aCfg *ApierCfg) AsMapInterface() map[string]interface{} { + cachesConns := make([]string, len(aCfg.CachesConns)) + for i, item := range aCfg.CachesConns { + buf := utils.ConcatenatedKey(utils.MetaInternal, utils.MetaCaches) + if item == buf { + cachesConns[i] = strings.ReplaceAll(item, utils.CONCATENATED_KEY_SEP+utils.MetaCaches, utils.EmptyString) + } else { + cachesConns[i] = item + } + } + schedulerConns := make([]string, len(aCfg.SchedulerConns)) + for i, item := range aCfg.SchedulerConns { + buf := utils.ConcatenatedKey(utils.MetaInternal, utils.MetaScheduler) + if item == buf { + schedulerConns[i] = strings.ReplaceAll(item, utils.CONCATENATED_KEY_SEP+utils.MetaScheduler, utils.EmptyString) + } else { + schedulerConns[i] = item + } + } + attributeSConns := make([]string, len(aCfg.AttributeSConns)) + for i, item := range aCfg.AttributeSConns { + buf := utils.ConcatenatedKey(utils.MetaInternal, utils.MetaAttributes) + if item == buf { + attributeSConns[i] = strings.ReplaceAll(item, utils.CONCATENATED_KEY_SEP+utils.MetaAttributes, utils.EmptyString) + } else { + attributeSConns[i] = item + } + } + return map[string]interface{}{ utils.EnabledCfg: aCfg.Enabled, - utils.CachesConnsCfg: aCfg.CachesConns, - utils.SchedulerConnsCfg: aCfg.SchedulerConns, - utils.AttributeSConnsCfg: aCfg.AttributeSConns, + utils.CachesConnsCfg: cachesConns, + utils.SchedulerConnsCfg: schedulerConns, + utils.AttributeSConnsCfg: attributeSConns, } } diff --git a/config/dispatchercfg.go b/config/dispatchercfg.go index 797f328c9..30122123f 100755 --- a/config/dispatchercfg.go +++ b/config/dispatchercfg.go @@ -18,7 +18,11 @@ along with this program. If not, see package config -import "github.com/cgrates/cgrates/utils" +import ( + "strings" + + "github.com/cgrates/cgrates/utils" +) // DispatcherSCfg is the configuration of dispatcher service type DispatcherSCfg struct { @@ -72,12 +76,36 @@ func (dps *DispatcherSCfg) loadFromJsonCfg(jsnCfg *DispatcherSJsonCfg) (err erro } func (dps *DispatcherSCfg) AsMapInterface() map[string]interface{} { + stringIndexedFields := []string{} + if dps.StringIndexedFields != nil { + stringIndexedFields = make([]string, len(*dps.StringIndexedFields)) + for i, item := range *dps.StringIndexedFields { + stringIndexedFields[i] = item + } + } + prefixIndexedFields := []string{} + if dps.PrefixIndexedFields != nil { + prefixIndexedFields = make([]string, len(*dps.PrefixIndexedFields)) + for i, item := range *dps.PrefixIndexedFields { + prefixIndexedFields[i] = item + } + } + attributeSConns := make([]string, len(dps.AttributeSConns)) + for i, item := range dps.AttributeSConns { + buf := utils.ConcatenatedKey(utils.MetaInternal, utils.MetaAttributes) + if item == buf { + attributeSConns[i] = strings.ReplaceAll(item, utils.CONCATENATED_KEY_SEP+utils.MetaAttributes, utils.EmptyString) + } else { + attributeSConns[i] = item + } + } + return map[string]interface{}{ utils.EnabledCfg: dps.Enabled, utils.IndexedSelectsCfg: dps.IndexedSelects, - utils.StringIndexedFieldsCfg: dps.StringIndexedFields, - utils.PrefixIndexedFieldsCfg: dps.PrefixIndexedFields, - utils.AttributeSConnsCfg: dps.AttributeSConns, + utils.StringIndexedFieldsCfg: stringIndexedFields, + utils.PrefixIndexedFieldsCfg: prefixIndexedFields, + utils.AttributeSConnsCfg: attributeSConns, utils.NestedFieldsCfg: dps.NestedFields, } diff --git a/config/erscfg_test.go b/config/erscfg_test.go index 05b3592d8..056396b15 100644 --- a/config/erscfg_test.go +++ b/config/erscfg_test.go @@ -331,3 +331,97 @@ func TestEventReaderSameID(t *testing.T) { } } + +func testERsCfgAsMapInterface(t *testing.T) { + cfgJSONStr := `{ + "ers": { + "enabled": true, + "sessions_conns":["conn1","conn3"], + "readers": [ + { + "id": "file_reader1", + "run_delay": "-1", + "type": "*file_csv", + "source_path": "/tmp/ers/in", + "processed_path": "/tmp/ers/out", + "cache_dump_fields": [], + }, + ], + } +}` + eMap := map[string]interface{}{ + "enabled": true, + "sessions_conns": []string{"conn1", "conn3"}, + "readers": []map[string]interface{}{ + { + "filters": []string{}, + "flags": map[string]interface{}{}, + "id": "*default", + "partial_record_cache": 0, + "processed_path": "/var/spool/cgrates/cdrc/out", + "row_length": 0, + "run_delay": 0, + "soome": "", + "source_path": "/var/spool/cgrates/cdrc/in", + "tenant": []string{}, + "timezone": "", + "xml_root_path": []string{""}, + "cache_dump_fields": []string{}, + "concurrent_requests": 1024, + "db_type": "*none", + "failed_calls_prefix": "", + "field_separator": ",", + "fields": []map[string]interface{}{ + {"mandatory": true, "path": "*cgreq.ToR", "tag": "ToR", "type": "*variable", "value": "~*req.2"}, + {"mandatory": true, "path": "*cgreq.OriginID", "tag": "OriginID", "type": "*variable", "value": "~*req.3"}, + {"mandatory": true, "path": "*cgreq.RequestType", "tag": "RequestType", "type": "*variable", "value": "~*req.4"}, + {"mandatory": true, "path": "*cgreq.Tenant", "tag": "Tenant", "type": "*variable", "value": "~*req.6"}, + {"mandatory": true, "path": "*cgreq.Category", "tag": "Category", "type": "*variable", "value": "~*req.7"}, + {"mandatory": true, "path": "*cgreq.Account", "tag": "Account", "type": "*variable", "value": "~*req.8"}, + {"mandatory": true, "path": "*cgreq.Subject", "tag": "Subject", "type": "*variable", "value": "~*req.9"}, + {"mandatory": true, "path": "*cgreq.Destination", "tag": "Destination", "type": "*variable", "value": "~*req.10"}, + {"mandatory": true, "path": "*cgreq.SetupTime", "tag": "SetupTime", "type": "*variable", "value": "~*req.11"}, + {"mandatory": true, "path": "*cgreq.AnswerTime", "tag": "AnswerTime", "type": "*variable", "value": "~*req.12"}, + {"mandatory": true, "path": "*cgreq.Usage", "tag": "Usage", "type": "*variable", "value": "~*req.13"}, + }, + }, + { + "cache_dump_fields": []string{}, + "concurrent_requests": 1024, + "db_type": "*file_csv", + "failed_calls_prefix": "", + "field_separator": ",", + "fields": []map[string]interface{}{ + {"mandatory": true, "path": "*cgreq.ToR", "tag": "ToR", "type": "*variable", "value": "~*req.2"}, + {"mandatory": true, "path": "*cgreq.OriginID", "tag": "OriginID", "type": "*variable", "value": "~*req.3"}, + {"mandatory": true, "path": "*cgreq.RequestType", "tag": "RequestType", "type": "*variable", "value": "~*req.4"}, + {"mandatory": true, "path": "*cgreq.Tenant", "tag": "Tenant", "type": "*variable", "value": "~*req.6"}, + {"mandatory": true, "path": "*cgreq.Category", "tag": "Category", "type": "*variable", "value": "~*req.7"}, + {"mandatory": true, "path": "*cgreq.Account", "tag": "Account", "type": "*variable", "value": "~*req.8"}, + {"mandatory": true, "path": "*cgreq.Subject", "tag": "Subject", "type": "*variable", "value": "~*req.9"}, + {"mandatory": true, "path": "*cgreq.Destination", "tag": "Destination", "type": "*variable", "value": "~*req.10"}, + {"mandatory": true, "path": "*cgreq.SetupTime", "tag": "SetupTime", "type": "*variable", "value": "~*req.11"}, + {"mandatory": true, "path": "*cgreq.AnswerTime", "tag": "AnswerTime", "type": "*variable", "value": "~*req.12"}, + {"mandatory": true, "path": "*cgreq.Usage", "tag": "Usage", "type": "*variable", "value": "~*req.13"}, + }, + "filters": nil, + "flags": map[string]interface{}{}, + "id": "file_reader1", + "partial_record_cache": 0, + "processed_path": "/tmp/ers/out", + "row_length": 0, + "run_delay": -1, + "soome": "", + "source_path": "/tmp/ers/in", + "tenant": []string{}, + "timezone": "", + "xml_root_path": []string{""}, + }, + }, + } + if cfg, err := NewCGRConfigFromJsonStringWithDefaults(cfgJSONStr); err != nil { + t.Error(err) + } else if rcv := cfg.ersCfg.AsMapInterface(utils.EmptyString); !reflect.DeepEqual(eMap, rcv) { + t.Errorf("\nExpected: %+v\nRecived: %+v", utils.ToJSON(eMap), utils.ToJSON(rcv)) + } +} diff --git a/config/loadercgrcfg.go b/config/loadercgrcfg.go index 929e98bec..9b1eaadab 100644 --- a/config/loadercgrcfg.go +++ b/config/loadercgrcfg.go @@ -98,7 +98,7 @@ func (ld *LoaderCgrCfg) AsMapInterface() map[string]interface{} { utils.TpIDCfg: ld.TpID, utils.DataPathCfg: ld.DataPath, utils.DisableReverseCfg: ld.DisableReverse, - utils.FieldSeparatorCfg: ld.FieldSeparator, + utils.FieldSeparatorCfg: string(ld.FieldSeparator), utils.CachesConnsCfg: ld.CachesConns, utils.SchedulerConnsCfg: ld.SchedulerConns, utils.GapiCredentialsCfg: gapiCredentials, diff --git a/config/loadercgrcfg_test.go b/config/loadercgrcfg_test.go index 2254aca45..baeac970e 100644 --- a/config/loadercgrcfg_test.go +++ b/config/loadercgrcfg_test.go @@ -61,3 +61,48 @@ func TestLoaderCgrCfgloadFromJsonCfg(t *testing.T) { t.Errorf("Expected: %+v , recived: %+v", utils.ToJSON(expected), utils.ToJSON(loadscfg)) } } + +func TestLoaderCgrCfgAsMapInterface(t *testing.T) { + var loadscfg LoaderCgrCfg + cfgJSONStr := `{ + "loader": { + "tpid": "", + "data_path": "./", + "disable_reverse": false, + "field_separator": ",", + "caches_conns":["*localhost"], + "scheduler_conns": ["*localhost"], + "gapi_credentials": ".gapi/credentials.json", + "gapi_token": ".gapi/token.json" + }, +}` + eMap := map[string]interface{}{ + "tpid": "", + "data_path": "./", + "disable_reverse": false, + "field_separator": ",", + "caches_conns": []string{"*localhost"}, + "scheduler_conns": []string{"*localhost"}, + "gapi_credentials": ".gapi/credentials.json", + "gapi_token": ".gapi/token.json", + } + if jsnCfg, err := NewCgrJsonCfgFromBytes([]byte(cfgJSONStr)); err != nil { + t.Error(err) + } else if jsnLoadersCfg, err := jsnCfg.LoaderCfgJson(); err != nil { + t.Error(err) + } else if err = loadscfg.loadFromJsonCfg(jsnLoadersCfg); err != nil { + t.Error(err) + } else if rcv := loadscfg.AsMapInterface(); !reflect.DeepEqual(eMap["tpid"], rcv["tpid"]) { + t.Errorf("Expected: %+v, Recived: %+v, at field: '%s'", utils.ToJSON(eMap["tpid"]), utils.ToJSON(rcv["tpid"]), "tpid") + } else if !reflect.DeepEqual(eMap["data_path"], rcv["data_path"]) { + t.Errorf("Expected: %+v, Recived: %+v, at field: %s", utils.ToJSON(eMap["data_path"]), utils.ToJSON(rcv["data_path"]), "data_path") + } else if !reflect.DeepEqual(eMap["disable_reverse"], rcv["disable_reverse"]) { + t.Errorf("Expected: %+v, Recived: %+v, at field: %s", utils.ToJSON(eMap["disable_reverse"]), utils.ToJSON(rcv["disable_reverse"]), "disable_reverse") + } else if !reflect.DeepEqual(eMap["field_separator"], rcv["field_separator"]) { + t.Errorf("Expected: %+v, Recived: %+v, at field: %s", utils.ToJSON(eMap["field_separator"]), utils.ToJSON(rcv["field_separator"]), "field_separator") + } else if !reflect.DeepEqual(eMap["caches_conns"], rcv["caches_conns"]) { + t.Errorf("Expected: %+v, Recived: %+v, at field: %s", utils.ToJSON(eMap["caches_conns"]), utils.ToJSON(rcv["caches_conns"]), "caches_conns") + } else if !reflect.DeepEqual(eMap["scheduler_conns"], rcv["scheduler_conns"]) { + t.Errorf("Expected: %+v, Recived: %+v, at field: %s", utils.ToJSON(eMap["scheduler_conns"]), utils.ToJSON(rcv["scheduler_conns"]), "scheduler_conns") + } +} diff --git a/config/mailercfg_test.go b/config/mailercfg_test.go index 5682457f2..bfeab40d9 100644 --- a/config/mailercfg_test.go +++ b/config/mailercfg_test.go @@ -20,6 +20,8 @@ package config import ( "reflect" "testing" + + "github.com/cgrates/cgrates/utils" ) func TestMailerCfgloadFromJsonCfg(t *testing.T) { @@ -58,3 +60,54 @@ func TestMailerCfgloadFromJsonCfg(t *testing.T) { t.Errorf("Expected: %+v , recived: %+v", expected, mailcfg) } } + +func TestMailerCfgAsMapInterface(t *testing.T) { + var mailcfg MailerCfg + cfgJSONStr := `{ + "mailer": { + "server": "", + "auth_user": "", + "auth_password": "", + "from_address": "", + }, +}` + eMap := map[string]interface{}{ + "server": "", + "auth_user": "", + "auth_password": "", + "from_address": "", + } + if jsnCfg, err := NewCgrJsonCfgFromBytes([]byte(cfgJSONStr)); err != nil { + t.Error(err) + } else if jsnMailCfg, err := jsnCfg.MailerJsonCfg(); err != nil { + t.Error(err) + } else if err = mailcfg.loadFromJsonCfg(jsnMailCfg); err != nil { + t.Error(err) + } else if rcv := mailcfg.AsMapInterface(); !reflect.DeepEqual(eMap, rcv) { + t.Errorf("\nExpected: %+v\nRecived: %+v", utils.ToJSON(eMap), utils.ToJSON(rcv)) + } + + cfgJSONStr = `{ + "mailer": { + "server": "localhost", + "auth_user": "cgrates", + "auth_password": "CGRateS.org", + "from_address": "cgr-mailer@localhost.localdomain", + }, + }` + eMap = map[string]interface{}{ + "server": "localhost", + "auth_user": "cgrates", + "auth_password": "CGRateS.org", + "from_address": "cgr-mailer@localhost.localdomain", + } + if jsnCfg, err := NewCgrJsonCfgFromBytes([]byte(cfgJSONStr)); err != nil { + t.Error(err) + } else if jsnMailCfg, err := jsnCfg.MailerJsonCfg(); err != nil { + t.Error(err) + } else if err = mailcfg.loadFromJsonCfg(jsnMailCfg); err != nil { + t.Error(err) + } else if rcv := mailcfg.AsMapInterface(); !reflect.DeepEqual(eMap, rcv) { + t.Errorf("\nExpected: %+v\nRecived: %+v", utils.ToJSON(eMap), utils.ToJSON(rcv)) + } +} diff --git a/config/migratorcfg_test.go b/config/migratorcfg_test.go index 97436a1bf..c464518ff 100644 --- a/config/migratorcfg_test.go +++ b/config/migratorcfg_test.go @@ -20,6 +20,8 @@ package config import ( "reflect" "testing" + + "github.com/cgrates/cgrates/utils" ) func TestMigratorCgrCfgloadFromJsonCfg(t *testing.T) { @@ -76,3 +78,99 @@ func TestMigratorCgrCfgloadFromJsonCfg(t *testing.T) { t.Errorf("Expected: %+v , recived: %+v", expected, migcfg) } } + +func TestMigratorCgrCfgAsMapInterface(t *testing.T) { + var migcfg MigratorCgrCfg + cfgJSONStr := `{ + "migrator": { + "out_datadb_type": "redis", + "out_datadb_host": "127.0.0.1", + "out_datadb_port": "6379", + "out_datadb_name": "10", + "out_datadb_user": "cgrates", + "out_datadb_password": "", + "out_datadb_encoding" : "msgpack", + "out_stordb_type": "mysql", + "out_stordb_host": "127.0.0.1", + "out_stordb_port": "3306", + "out_stordb_name": "cgrates", + "out_stordb_user": "cgrates", + "out_stordb_password": "", + "users_filters":[], + }, +}` + var users_filters []string + eMap := map[string]interface{}{ + "out_datadb_type": "redis", + "out_datadb_host": "127.0.0.1", + "out_datadb_port": "6379", + "out_datadb_name": "10", + "out_datadb_user": "cgrates", + "out_datadb_password": "", + "out_datadb_encoding": "msgpack", + "out_stordb_type": "mysql", + "out_stordb_host": "127.0.0.1", + "out_stordb_port": "3306", + "out_stordb_name": "cgrates", + "out_stordb_user": "cgrates", + "out_stordb_password": "", + "users_filters": users_filters, + "out_datadb_redis_sentinel": "", + } + if jsnCfg, err := NewCgrJsonCfgFromBytes([]byte(cfgJSONStr)); err != nil { + t.Error(err) + } else if jsnThSCfg, err := jsnCfg.MigratorCfgJson(); err != nil { + t.Error(err) + } else if err = migcfg.loadFromJsonCfg(jsnThSCfg); err != nil { + t.Error(err) + } else if rcv := migcfg.AsMapInterface(); !reflect.DeepEqual(eMap, rcv) { + t.Errorf("\nExpected: %+v\nRecived: %+v", utils.ToJSON(eMap), utils.ToJSON(rcv)) + } + cfgJSONStr = `{ + "migrator": { + "out_datadb_type": "redis", + "out_datadb_host": "127.0.0.1", + "out_datadb_port": "6379", + "out_datadb_name": "10", + "out_datadb_user": "cgrates", + "out_datadb_password": "out_datadb_password", + "out_datadb_encoding" : "msgpack", + "out_stordb_type": "mysql", + "out_stordb_host": "127.0.0.1", + "out_stordb_port": "3306", + "out_stordb_name": "cgrates", + "out_stordb_user": "cgrates", + "out_stordb_password": "out_stordb_password", + "users_filters":["users","filters","Account"], + "out_datadb_redis_sentinel": "out_datadb_redis_sentinel", + }, + }` + + eMap = map[string]interface{}{ + "out_datadb_type": "redis", + "out_datadb_host": "127.0.0.1", + "out_datadb_port": "6379", + "out_datadb_name": "10", + "out_datadb_user": "cgrates", + "out_datadb_password": "out_datadb_password", + "out_datadb_encoding": "msgpack", + "out_stordb_type": "mysql", + "out_stordb_host": "127.0.0.1", + "out_stordb_port": "3306", + "out_stordb_name": "cgrates", + "out_stordb_user": "cgrates", + "out_stordb_password": "out_stordb_password", + "users_filters": []string{"users", "filters", "Account"}, + "out_datadb_redis_sentinel": "out_datadb_redis_sentinel", + } + if jsnCfg, err := NewCgrJsonCfgFromBytes([]byte(cfgJSONStr)); err != nil { + t.Error(err) + } else if jsnThSCfg, err := jsnCfg.MigratorCfgJson(); err != nil { + t.Error(err) + } else if err = migcfg.loadFromJsonCfg(jsnThSCfg); err != nil { + t.Error(err) + } else if rcv := migcfg.AsMapInterface(); !reflect.DeepEqual(eMap, rcv) { + t.Errorf("\nExpected: %+v\nRecived: %+v", utils.ToJSON(eMap), utils.ToJSON(rcv)) + } + +} diff --git a/utils/consts.go b/utils/consts.go index b57478706..015d107ce 100755 --- a/utils/consts.go +++ b/utils/consts.go @@ -1956,29 +1956,29 @@ const ( // MigratorCgrCfg const ( - OutDataDBTypeCfg = "Out_dataDB_type" - OutDataDBHostCfg = "Out_dataDB_host" - OutDataDBPortCfg = "Out_dataDB_port" - OutDataDBNameCfg = "Out_dataDB_name" - OutDataDBUserCfg = "Out_dataDB_user" - OutDataDBPasswordCfg = "Out_dataDB_password" - OutDataDBEncodingCfg = "Out_dataDB_encoding" - OutDataDBRedisSentinelCfg = "Out_dataDB_redis_sentinel" - OutStorDBTypeCfg = "Out_storDB_type" - OutStorDBHostCfg = "Out_storDB_host" - OutStorDBPortCfg = "Out_storDB_port" - OutStorDBNameCfg = "Out_storDB_name" - OutStorDBUserCfg = "Out_storDB_user" - OutStorDBPasswordCfg = "Out_storDB_password" - UsersFiltersCfg = "Users_filters" + OutDataDBTypeCfg = "out_datadb_type" + OutDataDBHostCfg = "out_datadb_host" + OutDataDBPortCfg = "out_datadb_port" + OutDataDBNameCfg = "out_datadb_name" + OutDataDBUserCfg = "out_datadb_user" + OutDataDBPasswordCfg = "out_datadb_password" + OutDataDBEncodingCfg = "out_datadb_encoding" + OutDataDBRedisSentinelCfg = "out_datadb_redis_sentinel" + OutStorDBTypeCfg = "out_stordb_type" + OutStorDBHostCfg = "out_stordb_host" + OutStorDBPortCfg = "out_stordb_port" + OutStorDBNameCfg = "out_stordb_name" + OutStorDBUserCfg = "out_stordb_user" + OutStorDBPasswordCfg = "out_stordb_password" + UsersFiltersCfg = "users_filters" ) // MailerCfg const ( - MailerServerCfg = "Server" - MailerAuthUserCfg = "Auth_user" - MailerAuthPassCfg = "Auth_password" - MailerFromAddrCfg = "From_address" + MailerServerCfg = "server" + MailerAuthUserCfg = "auth_user" + MailerAuthPassCfg = "auth_password" + MailerFromAddrCfg = "from_address" ) // EventReaderCfg