Added the config for the new subsystem: dispatcherh

This commit is contained in:
Trial97
2020-08-19 13:10:00 +03:00
committed by Dan Christian Bogos
parent f175e62096
commit 18e6578840
13 changed files with 297 additions and 47 deletions

View File

@@ -172,6 +172,7 @@ func NewDefaultCGRConfig() (cfg *CGRConfig, err error) {
cfg.routeSCfg = new(RouteSCfg)
cfg.sureTaxCfg = new(SureTaxCfg)
cfg.dispatcherSCfg = new(DispatcherSCfg)
cfg.dispatcherHCfg = new(DispatcherHCfg)
cfg.loaderCgrCfg = new(LoaderCgrCfg)
cfg.migratorCgrCfg = new(MigratorCgrCfg)
cfg.mailerCfg = new(MailerCfg)
@@ -292,6 +293,7 @@ type CGRConfig struct {
routeSCfg *RouteSCfg // RouteS config
sureTaxCfg *SureTaxCfg // SureTax config
dispatcherSCfg *DispatcherSCfg // DispatcherS config
dispatcherHCfg *DispatcherHCfg // DispatcherS config
loaderCgrCfg *LoaderCgrCfg // LoaderCgr config
migratorCgrCfg *MigratorCgrCfg // MigratorCgr config
mailerCfg *MailerCfg // Mailer config
@@ -366,7 +368,7 @@ func (cfg *CGRConfig) loadFromJsonCfg(jsnCfg *CgrJsonCfg) (err error) {
cfg.loadMailerCfg, cfg.loadSureTaxCfg, cfg.loadDispatcherSCfg,
cfg.loadLoaderCgrCfg, cfg.loadMigratorCgrCfg, cfg.loadTlsCgrCfg,
cfg.loadAnalyzerCgrCfg, cfg.loadApierCfg, cfg.loadErsCfg, cfg.loadEesCfg,
cfg.loadRateSCfg, cfg.loadSIPAgentCfg} {
cfg.loadRateSCfg, cfg.loadSIPAgentCfg, cfg.loadDispatcherHCfg} {
if err = loadFunc(jsnCfg); err != nil {
return
}
@@ -661,6 +663,15 @@ func (cfg *CGRConfig) loadDispatcherSCfg(jsnCfg *CgrJsonCfg) (err error) {
return cfg.dispatcherSCfg.loadFromJsonCfg(jsnDispatcherSCfg)
}
// loadDispatcherHCfg loads the DispatcherS section of the configuration
func (cfg *CGRConfig) loadDispatcherHCfg(jsnCfg *CgrJsonCfg) (err error) {
var jsnDispatcherHCfg *DispatcherHJsonCfg
if jsnDispatcherHCfg, err = jsnCfg.DispatcherHJsonCfg(); err != nil {
return
}
return cfg.dispatcherHCfg.loadFromJsonCfg(jsnDispatcherHCfg)
}
// loadLoaderCgrCfg loads the Loader section of the configuration
func (cfg *CGRConfig) loadLoaderCgrCfg(jsnCfg *CgrJsonCfg) (err error) {
var jsnLoaderCgrCfg *LoaderCfgJson
@@ -882,6 +893,13 @@ func (cfg *CGRConfig) DispatcherSCfg() *DispatcherSCfg {
return cfg.dispatcherSCfg
}
// DispatcherHCfg returns the config for DispatcherS
func (cfg *CGRConfig) DispatcherHCfg() *DispatcherHCfg {
cfg.lks[DispatcherSJson].Lock()
defer cfg.lks[DispatcherSJson].Unlock()
return cfg.dispatcherHCfg
}
// MigratorCgrCfg returns the config for Migrator
func (cfg *CGRConfig) MigratorCgrCfg() *MigratorCgrCfg {
cfg.lks[CgrMigratorCfgJson].Lock()
@@ -1086,6 +1104,8 @@ func (cfg *CGRConfig) V1GetConfigSection(args *StringWithOpts, reply *map[string
jsonString = utils.ToJSON(cfg.SureTaxCfg())
case DispatcherSJson:
jsonString = utils.ToJSON(cfg.DispatcherSCfg())
case DispatcherHJson:
jsonString = utils.ToJSON(cfg.DispatcherHCfg())
case LoaderJson:
jsonString = utils.ToJSON(cfg.LoaderCfg())
case CgrLoaderCfgJson:
@@ -1222,6 +1242,7 @@ func (cfg *CGRConfig) getLoadFunctions() map[string]func(*CgrJsonCfg) error {
CgrLoaderCfgJson: cfg.loadLoaderCgrCfg,
CgrMigratorCfgJson: cfg.loadMigratorCgrCfg,
DispatcherSJson: cfg.loadDispatcherSCfg,
DispatcherHJson: cfg.loadDispatcherHCfg,
AnalyzerCfgJson: cfg.loadAnalyzerCgrCfg,
ApierS: cfg.loadApierCfg,
RPCConnsJsonName: cfg.loadRPCConns,
@@ -1552,6 +1573,7 @@ func (cfg *CGRConfig) AsMapInterface(separator string) map[string]interface{} {
utils.RouteSCfg: cfg.routeSCfg.AsMapInterface(),
utils.SureTaxCfg: cfg.sureTaxCfg.AsMapInterface(separator),
utils.DispatcherSCfg: cfg.dispatcherSCfg.AsMapInterface(),
utils.DispatcherHCfg: cfg.dispatcherHCfg.AsMapInterface(),
utils.LoaderCgrCfg: cfg.loaderCgrCfg.AsMapInterface(),
utils.MigratorCgrCfg: cfg.migratorCgrCfg.AsMapInterface(),
utils.MailerCfg: cfg.mailerCfg.AsMapInterface(),

View File

@@ -171,13 +171,14 @@ const CGRATES_CFG_JSON = `
},
"http": { // HTTP server configuration
"json_rpc_url": "/jsonrpc", // JSON RPC relative URL ("" to disable)
"ws_url": "/ws", // WebSockets relative URL ("" to disable)
"freeswitch_cdrs_url": "/freeswitch_json", // Freeswitch CDRS relative URL ("" to disable)
"http_cdrs": "/cdr_http", // CDRS relative URL ("" to disable)
"use_basic_auth": false, // use basic authentication
"auth_users": {}, // basic authentication usernames and base64-encoded passwords (eg: { "username1": "cGFzc3dvcmQ=", "username2": "cGFzc3dvcmQy "})
"http": { // HTTP server configuration
"json_rpc_url": "/jsonrpc", // JSON RPC relative URL ("" to disable)
"dispatchers_registrar_url": "/dispatchers_registrar", // dispatcherH registrar service relative URL
"ws_url": "/ws", // WebSockets relative URL ("" to disable)
"freeswitch_cdrs_url": "/freeswitch_json", // Freeswitch CDRS relative URL ("" to disable)
"http_cdrs": "/cdr_http", // CDRS relative URL ("" to disable)
"use_basic_auth": false, // use basic authentication
"auth_users": {}, // basic authentication usernames and base64-encoded passwords (eg: { "username1": "cGFzc3dvcmQ=", "username2": "cGFzc3dvcmQy "})
},
@@ -931,6 +932,15 @@ const CGRATES_CFG_JSON = `
},
"dispatcherh":{
"enabled": false,
"dispatchers_conns": [],
"host_ids": [],
"register_interval": "5m",
"register_transport": "*json",
},
"analyzers":{ // AnalyzerS config
"enabled":false // starts AnalyzerS service: <true|false>.
},

View File

@@ -49,6 +49,7 @@ const (
MAILER_JSN = "mailer"
SURETAX_JSON = "suretax"
DispatcherSJson = "dispatchers"
DispatcherHJson = "dispatcherh"
CgrLoaderCfgJson = "loader"
CgrMigratorCfgJson = "migrator"
ChargerSCfgJson = "chargers"
@@ -435,6 +436,18 @@ func (self CgrJsonCfg) DispatcherSJsonCfg() (*DispatcherSJsonCfg, error) {
return cfg, nil
}
func (self CgrJsonCfg) DispatcherHJsonCfg() (*DispatcherHJsonCfg, error) {
rawCfg, hasKey := self[DispatcherHJson]
if !hasKey {
return nil, nil
}
cfg := new(DispatcherHJsonCfg)
if err := json.Unmarshal(*rawCfg, cfg); err != nil {
return nil, err
}
return cfg, nil
}
func (self CgrJsonCfg) LoaderCfgJson() (*LoaderCfgJson, error) {
rawCfg, hasKey := self[CgrLoaderCfgJson]
if !hasKey {

View File

@@ -1690,12 +1690,13 @@ func TestDfSureTaxJsonCfg(t *testing.T) {
func TestDfHttpJsonCfg(t *testing.T) {
eCfg := &HTTPJsonCfg{
Json_rpc_url: utils.StringPointer("/jsonrpc"),
Ws_url: utils.StringPointer("/ws"),
Freeswitch_cdrs_url: utils.StringPointer("/freeswitch_json"),
Http_Cdrs: utils.StringPointer("/cdr_http"),
Use_basic_auth: utils.BoolPointer(false),
Auth_users: utils.MapStringStringPointer(map[string]string{}),
Json_rpc_url: utils.StringPointer("/jsonrpc"),
Dispatchers_registrar_url: utils.StringPointer("/dispatchers_registrar"),
Ws_url: utils.StringPointer("/ws"),
Freeswitch_cdrs_url: utils.StringPointer("/freeswitch_json"),
Http_Cdrs: utils.StringPointer("/cdr_http"),
Use_basic_auth: utils.BoolPointer(false),
Auth_users: utils.MapStringStringPointer(map[string]string{}),
}
if cfg, err := dfCgrJSONCfg.HttpJsonCfg(); err != nil {
t.Error(err)

71
config/dispatcherhcfg.go Executable file
View File

@@ -0,0 +1,71 @@
/*
Real-time Online/Offline Charging System (OCS) for Telecom & ISP environments
Copyright (C) ITsysCOM GmbH
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>
*/
package config
import (
"time"
"github.com/cgrates/cgrates/utils"
)
// DispatcherHCfg is the configuration of dispatcher hosts
type DispatcherHCfg struct {
Enabled bool
DispatchersConns []string
HostIDs []string
RegisterInterval time.Duration
RegisterTransport string
}
func (dps *DispatcherHCfg) loadFromJsonCfg(jsnCfg *DispatcherHJsonCfg) (err error) {
if jsnCfg == nil {
return nil
}
if jsnCfg.Enabled != nil {
dps.Enabled = *jsnCfg.Enabled
}
if jsnCfg.Dispatchers_conns != nil {
dps.DispatchersConns = make([]string, len(*jsnCfg.Dispatchers_conns))
copy(dps.DispatchersConns, *jsnCfg.Dispatchers_conns)
}
if jsnCfg.Host_ids != nil {
dps.HostIDs = make([]string, len(*jsnCfg.Host_ids))
copy(dps.HostIDs, *jsnCfg.Host_ids)
}
if jsnCfg.Register_interval != nil {
if dps.RegisterInterval, err = utils.ParseDurationWithNanosecs(*jsnCfg.Register_interval); err != nil {
return
}
}
if jsnCfg.Register_transport != nil {
dps.RegisterTransport = *jsnCfg.Register_transport
}
return
}
func (dps *DispatcherHCfg) AsMapInterface() map[string]interface{} {
return map[string]interface{}{
utils.EnabledCfg: dps.Enabled,
utils.DispatchersConnsCfg: dps.DispatchersConns,
utils.HostIdsCfg: dps.HostIDs,
utils.RegisterIntervalCfg: dps.RegisterInterval,
utils.RegisterTransportCfg: dps.RegisterTransport,
}
}

View File

@@ -0,0 +1,105 @@
/*
Real-time Online/Offline Charging System (OCS) for Telecom & ISP environments
Copyright (C) ITsysCOM GmbH
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>
*/
package config
import (
"reflect"
"testing"
"time"
"github.com/cgrates/cgrates/utils"
)
func TestDispatcherHCfgloadFromJsonCfg(t *testing.T) {
var daCfg, expected DispatcherHCfg
if err := daCfg.loadFromJsonCfg(nil); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(daCfg, expected) {
t.Errorf("Expected: %+v ,recived: %+v", expected, daCfg)
}
if err := daCfg.loadFromJsonCfg(new(DispatcherHJsonCfg)); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(daCfg, expected) {
t.Errorf("Expected: %+v ,recived: %+v", expected, daCfg)
}
cfgJSONStr := `{
"dispatcherh":{
"enabled": true,
"dispatchers_conns": ["conn1","conn2"],
"host_ids": ["HOST1","HOST2"],
"register_interval": "5m",
"register_transport": "*json",
},
}`
expected = DispatcherHCfg{
Enabled: true,
DispatchersConns: []string{"conn1", "conn2"},
HostIDs: []string{"HOST1", "HOST2"},
RegisterInterval: 5 * time.Minute,
RegisterTransport: utils.MetaJSON,
}
if jsnCfg, err := NewCgrJsonCfgFromBytes([]byte(cfgJSONStr)); err != nil {
t.Error(err)
} else if jsnDaCfg, err := jsnCfg.DispatcherHJsonCfg(); err != nil {
t.Error(err)
} else if err = daCfg.loadFromJsonCfg(jsnDaCfg); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(expected, daCfg) {
t.Errorf("Expected: %+v,\nRecived: %+v", utils.ToJSON(expected), utils.ToJSON(daCfg))
}
}
func TestDispatcherHCfgAsMapInterface(t *testing.T) {
var daCfg, expected DispatcherHCfg
if err := daCfg.loadFromJsonCfg(nil); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(daCfg, expected) {
t.Errorf("Expected: %+v ,recived: %+v", expected, daCfg)
}
if err := daCfg.loadFromJsonCfg(new(DispatcherHJsonCfg)); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(daCfg, expected) {
t.Errorf("Expected: %+v ,recived: %+v", expected, daCfg)
}
cfgJSONStr := `{
"dispatcherh":{
"enabled": true,
"dispatchers_conns": ["conn1","conn2"],
"host_ids": ["HOST1","HOST2"],
"register_interval": "5m",
"register_transport": "*json",
},
}`
eMap := map[string]interface{}{
"enabled": true,
"dispatchers_conns": []string{"conn1", "conn2"},
"host_ids": []string{"HOST1", "HOST2"},
"register_interval": 5 * time.Minute,
"register_transport": "*json",
}
if jsnCfg, err := NewCgrJsonCfgFromBytes([]byte(cfgJSONStr)); err != nil {
t.Error(err)
} else if jsnDaCfg, err := jsnCfg.DispatcherHJsonCfg(); err != nil {
t.Error(err)
} else if err = daCfg.loadFromJsonCfg(jsnDaCfg); err != nil {
t.Error(err)
} else if rcv := daCfg.AsMapInterface(); !reflect.DeepEqual(eMap, rcv) {
t.Errorf("\nExpected: %+v\nRecived: %+v", utils.ToJSON(eMap), utils.ToJSON(rcv))
}
}

View File

@@ -22,12 +22,13 @@ import "github.com/cgrates/cgrates/utils"
// HTTP config section
type HTTPCfg struct {
HTTPJsonRPCURL string // JSON RPC relative URL ("" to disable)
HTTPWSURL string // WebSocket relative URL ("" to disable)
HTTPFreeswitchCDRsURL string // Freeswitch CDRS relative URL ("" to disable)
HTTPCDRsURL string // CDRS relative URL ("" to disable)
HTTPUseBasicAuth bool // Use basic auth for HTTP API
HTTPAuthUsers map[string]string // Basic auth user:password map (base64 passwords)
HTTPJsonRPCURL string // JSON RPC relative URL ("" to disable)
DispatchersRegistrarURL string // dispatcherH registrar service relative URL
HTTPWSURL string // WebSocket relative URL ("" to disable)
HTTPFreeswitchCDRsURL string // Freeswitch CDRS relative URL ("" to disable)
HTTPCDRsURL string // CDRS relative URL ("" to disable)
HTTPUseBasicAuth bool // Use basic auth for HTTP API
HTTPAuthUsers map[string]string // Basic auth user:password map (base64 passwords)
}
//loadFromJsonCfg loads Database config from JsonCfg
@@ -38,6 +39,9 @@ func (httpcfg *HTTPCfg) loadFromJsonCfg(jsnHttpCfg *HTTPJsonCfg) (err error) {
if jsnHttpCfg.Json_rpc_url != nil {
httpcfg.HTTPJsonRPCURL = *jsnHttpCfg.Json_rpc_url
}
if jsnHttpCfg.Dispatchers_registrar_url != nil {
httpcfg.DispatchersRegistrarURL = *jsnHttpCfg.Dispatchers_registrar_url
}
if jsnHttpCfg.Ws_url != nil {
httpcfg.HTTPWSURL = *jsnHttpCfg.Ws_url
}
@@ -64,11 +68,12 @@ func (httpcfg *HTTPCfg) AsMapInterface() map[string]interface{} {
}
return map[string]interface{}{
utils.HTTPJsonRPCURLCfg: httpcfg.HTTPJsonRPCURL,
utils.HTTPWSURLCfg: httpcfg.HTTPWSURL,
utils.HTTPFreeswitchCDRsURLCfg: httpcfg.HTTPFreeswitchCDRsURL,
utils.HTTPCDRsURLCfg: httpcfg.HTTPCDRsURL,
utils.HTTPUseBasicAuthCfg: httpcfg.HTTPUseBasicAuth,
utils.HTTPAuthUsersCfg: httpUsers,
utils.HTTPJsonRPCURLCfg: httpcfg.HTTPJsonRPCURL,
utils.DispatchersRegistrarURLCfg: httpcfg.DispatchersRegistrarURL,
utils.HTTPWSURLCfg: httpcfg.HTTPWSURL,
utils.HTTPFreeswitchCDRsURLCfg: httpcfg.HTTPFreeswitchCDRsURL,
utils.HTTPCDRsURLCfg: httpcfg.HTTPCDRsURL,
utils.HTTPUseBasicAuthCfg: httpcfg.HTTPUseBasicAuth,
utils.HTTPAuthUsersCfg: httpUsers,
}
}

View File

@@ -70,6 +70,7 @@ func TestHTTPCfgAsMapInterface(t *testing.T) {
cfgJSONStr := `{
"http": {
"json_rpc_url": "/jsonrpc",
"dispatchers_registrar_url": "/dispatchers_registrar",
"ws_url": "/ws",
"freeswitch_cdrs_url": "/freeswitch_json",
"http_cdrs": "/cdr_http",
@@ -79,12 +80,13 @@ func TestHTTPCfgAsMapInterface(t *testing.T) {
}`
eMap := map[string]interface{}{
"json_rpc_url": "/jsonrpc",
"ws_url": "/ws",
"freeswitch_cdrs_url": "/freeswitch_json",
"http_cdrs": "/cdr_http",
"use_basic_auth": false,
"auth_users": map[string]interface{}{},
"json_rpc_url": "/jsonrpc",
"dispatchers_registrar_url": "/dispatchers_registrar",
"ws_url": "/ws",
"freeswitch_cdrs_url": "/freeswitch_json",
"http_cdrs": "/cdr_http",
"use_basic_auth": false,
"auth_users": map[string]interface{}{},
}
if jsnCfg, err := NewCgrJsonCfgFromBytes([]byte(cfgJSONStr)); err != nil {

View File

@@ -18,7 +18,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>
package config
import "encoding/json"
import (
"encoding/json"
)
// General config section
type GeneralJsonCfg struct {
@@ -62,12 +64,13 @@ type ListenJsonCfg struct {
// HTTP config section
type HTTPJsonCfg struct {
Json_rpc_url *string
Ws_url *string
Freeswitch_cdrs_url *string
Http_Cdrs *string
Use_basic_auth *bool
Auth_users *map[string]string
Json_rpc_url *string
Dispatchers_registrar_url *string
Ws_url *string
Freeswitch_cdrs_url *string
Http_Cdrs *string
Use_basic_auth *bool
Auth_users *map[string]string
}
type TlsJsonCfg struct {
@@ -539,6 +542,14 @@ type DispatcherSJsonCfg struct {
Attributes_conns *[]string
}
type DispatcherHJsonCfg struct {
Enabled *bool
Dispatchers_conns *[]string
Host_ids *[]string
Register_interval *string
Register_transport *string
}
type LoaderCfgJson struct {
Tpid *string
Data_path *string

View File

@@ -277,8 +277,8 @@ func TestDispatcherHostIDsProfilesReorderFromIndex(t *testing.T) {
}
func TestDispatcherHostIDsProfilesShuffle(t *testing.T) {
dConns := DispatcherHostIDs{"DSP_1", "DSP_2", "DSP_3", "DSP_4"}
oConns := DispatcherHostIDs{"DSP_1", "DSP_2", "DSP_3", "DSP_4"}
dConns := DispatcherHostIDs{"DSP_1", "DSP_2", "DSP_3", "DSP_4", "DSP_5", "DSP_6", "DSP_7", "DSP_8"}
oConns := DispatcherHostIDs{"DSP_1", "DSP_2", "DSP_3", "DSP_4", "DSP_5", "DSP_6", "DSP_7", "DSP_8"}
if dConns.Shuffle(); reflect.DeepEqual(dConns, oConns) {
t.Errorf("received: %s", utils.ToJSON(dConns))
}

View File

@@ -1921,12 +1921,13 @@ const (
// HTTPCfg
const (
HTTPJsonRPCURLCfg = "json_rpc_url"
HTTPWSURLCfg = "ws_url"
HTTPFreeswitchCDRsURLCfg = "freeswitch_cdrs_url"
HTTPCDRsURLCfg = "http_cdrs"
HTTPUseBasicAuthCfg = "use_basic_auth"
HTTPAuthUsersCfg = "auth_users"
HTTPJsonRPCURLCfg = "json_rpc_url"
DispatchersRegistrarURLCfg = "dispatchers_registrar_url"
HTTPWSURLCfg = "ws_url"
HTTPFreeswitchCDRsURLCfg = "freeswitch_cdrs_url"
HTTPCDRsURLCfg = "http_cdrs"
HTTPUseBasicAuthCfg = "use_basic_auth"
HTTPAuthUsersCfg = "auth_users"
)
// FilterSCfg
@@ -2211,6 +2212,14 @@ const (
CacheDumpFieldsCfg = "cache_dump_fields"
)
// DispatcherHCfg
const (
DispatchersConnsCfg = "dispatchers_conns"
HostIdsCfg = "host_ids"
RegisterIntervalCfg = "register_interval"
RegisterTransportCfg = "register_transport"
)
// CGRConfig
const (
LoaderCfg = "loaders" // from JSON
@@ -2241,6 +2250,7 @@ const (
RouteSCfg = "routes" // from JSON
SureTaxCfg = "suretax" // from JSON
DispatcherSCfg = "dispatchers" // from JSON
DispatcherHCfg = "dispatcherh" // from JSON
LoaderCgrCfg = "loader" // from JSON
MigratorCgrCfg = "migrator" // from JSON
MailerCfg = "mailer" // from JSON