From 016e9131901a34a1cd14349eca741748501ee68d Mon Sep 17 00:00:00 2001 From: nickolasdaniel Date: Wed, 14 Jul 2021 16:32:53 +0300 Subject: [PATCH] Added extra configurable fields for DispatcherHost related structs, corresponding tests and redesigned methods where needed --- .../dispatchers/DispatcherHosts.csv | 10 +- engine/libtest.go | 4 +- engine/loader_csv_test.go | 18 ++- engine/model_helpers.go | 79 +++++++--- engine/model_helpers_test.go | 145 ++++++++++++++---- engine/models.go | 24 ++- engine/storage_csv.go | 6 +- engine/storage_sql.go | 5 +- loaders/loader.go | 6 +- loaders/loader_test.go | 78 +++++++++- utils/apitpdata.go | 14 +- 11 files changed, 305 insertions(+), 84 deletions(-) diff --git a/data/tariffplans/dispatchers/DispatcherHosts.csv b/data/tariffplans/dispatchers/DispatcherHosts.csv index 4d4050eeb..66a1f1e68 100644 --- a/data/tariffplans/dispatchers/DispatcherHosts.csv +++ b/data/tariffplans/dispatchers/DispatcherHosts.csv @@ -1,5 +1,5 @@ -#Tenant[0],ID[1],Address[2],Transport[3],TLS[4] -cgrates.org,SELF,*internal,, -cgrates.org,ALL,127.0.0.1:6012,*json,false -cgrates.org,ALL2,127.0.0.1:7012,*json,false -cgrates.org,NonexistingHost,127.0.0.1:10012,*json,false +#Tenant[0],ID[1],Address[2],Transport[3],Synchronous[4],ConnectAttempts[5],Reconnects[6],ConnectTimeout[7],ReplyTimeout[8],Tls[9],ClientKey[10],ClientCertificate[11],CaCertificate[12] +cgrates.org,SELF,*internal,,false,1,3,"1m","2m",true,"key1","cert1","ca_cert1" +cgrates.org,ALL,127.0.0.1:6012,*json,false,1,3,"1m","2m",true,"key2","cert2","ca_cert2" +cgrates.org,ALL2,127.0.0.1:7012,*json,false,1,3,"1m","2m",true,"key3","cert3","ca_cert3", +cgrates.org,NonexistingHost,127.0.0.1:10012,*json,false,1,3,"1m","2m",true,"key4","cert4","ca_cert4" \ No newline at end of file diff --git a/engine/libtest.go b/engine/libtest.go index 1ba470fd1..326d99697 100644 --- a/engine/libtest.go +++ b/engine/libtest.go @@ -278,8 +278,8 @@ cgrates.org,D1,*any,*string:~*req.Account:1001,2014-07-29T15:00:00Z,*first,,C1,* cgrates.org,D1,,,,*first,,C2,*lt:~*req.Usage:10,10,false,192.168.56.204, ` DispatcherHostCSVContent = ` -#Tenant[0],ID[1],Address[2],Transport[3],TLS[4] -cgrates.org,ALL1,127.0.0.1:2012,*json,true +#Tenant[0],ID[1],Address[2],Transport[3],Synchronous[4],ConnectAttempts[5],Reconnects[6],ConnectTimeout[7],ReplyTimeout[8],TLS[9],ClientKey[10],ClientCertificate[11],CaCertificate[12] +cgrates.org,ALL,127.0.0.1:6012,*json,false,1,3,1m,2m,true,key2,cert2,ca_cert2 ` ) diff --git a/engine/loader_csv_test.go b/engine/loader_csv_test.go index 961b4d41c..6c29c1cf8 100644 --- a/engine/loader_csv_test.go +++ b/engine/loader_csv_test.go @@ -1396,15 +1396,23 @@ func TestLoadDispatcherHosts(t *testing.T) { eDispatcherHosts := &utils.TPDispatcherHost{ TPid: testTPID, Tenant: "cgrates.org", - ID: "ALL1", + ID: "ALL", Conn: &utils.TPDispatcherHostConn{ - Address: "127.0.0.1:2012", - Transport: utils.MetaJSON, - TLS: true, + Address: "127.0.0.1:6012", + Transport: utils.MetaJSON, + Synchronous: false, + ConnectAttempts: 1, + Reconnects: 3, + ConnectTimeout: 1 * time.Minute, + ReplyTimeout: 2 * time.Minute, + TLS: true, + ClientKey: "key2", + ClientCertificate: "cert2", + CaCertificate: "ca_cert2", }, } - dphKey := utils.TenantID{Tenant: "cgrates.org", ID: "ALL1"} + dphKey := utils.TenantID{Tenant: "cgrates.org", ID: "ALL"} if len(csvr.dispatcherHosts) != 1 { t.Fatalf("Failed to load DispatcherHosts: %v", len(csvr.dispatcherHosts)) } diff --git a/engine/model_helpers.go b/engine/model_helpers.go index 622f40e03..ecda73d58 100644 --- a/engine/model_helpers.go +++ b/engine/model_helpers.go @@ -2796,10 +2796,10 @@ type DispatcherHostMdls []*DispatcherHostMdl // CSVHeader return the header for csv fields as a slice of string func (tps DispatcherHostMdls) CSVHeader() (result []string) { - return []string{"#" + utils.Tenant, utils.ID, utils.Address, utils.Transport, utils.TLS} + return []string{"#" + utils.Tenant, utils.ID, utils.Address, utils.Transport, utils.SynchronousCfg, utils.ConnectAttemptsCfg, utils.ReconnectsCfg, utils.ConnectTimeoutCfg, utils.ReplyTimeoutCfg, utils.TLS, utils.ClientKeyCfg, utils.ClientCerificateCfg, utils.CaCertificateCfg} } -func (tps DispatcherHostMdls) AsTPDispatcherHosts() (result []*utils.TPDispatcherHost) { +func (tps DispatcherHostMdls) AsTPDispatcherHosts() (result []*utils.TPDispatcherHost, err error) { hostsMap := make(map[string]*utils.TPDispatcherHost) for _, tp := range tps { if len(tp.Address) == 0 { // empty addres do not populate conns @@ -2808,16 +2808,33 @@ func (tps DispatcherHostMdls) AsTPDispatcherHosts() (result []*utils.TPDispatche if len(tp.Transport) == 0 { tp.Transport = utils.MetaJSON } - hostsMap[utils.ConcatenatedKey(tp.Tenant, tp.ID)] = &utils.TPDispatcherHost{ + tntId := utils.ConcatenatedKey(tp.Tenant, tp.ID) + hostsMap[tntId] = &utils.TPDispatcherHost{ TPid: tp.Tpid, Tenant: tp.Tenant, ID: tp.ID, Conn: &utils.TPDispatcherHostConn{ - Address: tp.Address, - Transport: tp.Transport, - TLS: tp.TLS, + Address: tp.Address, + Transport: tp.Transport, + Synchronous: tp.Synchronous, + ConnectAttempts: tp.ConnectAttempts, + Reconnects: tp.Reconnects, + TLS: tp.TLS, + ClientKey: tp.ClientKey, + ClientCertificate: tp.ClientCertificate, + CaCertificate: tp.CaCertificate, }, } + if tp.ConnectTimeout != utils.EmptyString { + if hostsMap[tntId].Conn.ConnectTimeout, err = utils.ParseDurationWithNanosecs(tp.ConnectTimeout); err != nil { + return nil, err + } + } + if tp.ReplyTimeout != utils.EmptyString { + if hostsMap[tntId].Conn.ReplyTimeout, err = utils.ParseDurationWithNanosecs(tp.ReplyTimeout); err != nil { + return nil, err + } + } continue } for _, host := range hostsMap { @@ -2831,12 +2848,20 @@ func APItoModelTPDispatcherHost(tpDPH *utils.TPDispatcherHost) (mdls *Dispatcher return } return &DispatcherHostMdl{ - Tpid: tpDPH.TPid, - Tenant: tpDPH.Tenant, - ID: tpDPH.ID, - Address: tpDPH.Conn.Address, - Transport: tpDPH.Conn.Transport, - TLS: tpDPH.Conn.TLS, + Tpid: tpDPH.TPid, + Tenant: tpDPH.Tenant, + ID: tpDPH.ID, + Address: tpDPH.Conn.Address, + Transport: tpDPH.Conn.Transport, + Synchronous: tpDPH.Conn.Synchronous, + ConnectAttempts: tpDPH.Conn.ConnectAttempts, + Reconnects: tpDPH.Conn.Reconnects, + ConnectTimeout: tpDPH.Conn.ConnectTimeout.String(), + ReplyTimeout: tpDPH.Conn.ReplyTimeout.String(), + TLS: tpDPH.Conn.TLS, + ClientKey: tpDPH.Conn.ClientKey, + ClientCertificate: tpDPH.Conn.ClientCertificate, + CaCertificate: tpDPH.Conn.CaCertificate, } } @@ -2847,10 +2872,18 @@ func APItoDispatcherHost(tpDPH *utils.TPDispatcherHost) (dpp *DispatcherHost) { return &DispatcherHost{ Tenant: tpDPH.Tenant, RemoteHost: &config.RemoteHost{ - ID: tpDPH.ID, - Address: tpDPH.Conn.Address, - Transport: tpDPH.Conn.Transport, - TLS: tpDPH.Conn.TLS, + ID: tpDPH.ID, + Address: tpDPH.Conn.Address, + Transport: tpDPH.Conn.Transport, + Synchronous: tpDPH.Conn.Synchronous, + ConnectAttempts: tpDPH.Conn.ConnectAttempts, + Reconnects: tpDPH.Conn.Reconnects, + ConnectTimeout: tpDPH.Conn.ConnectTimeout, + ReplyTimeout: tpDPH.Conn.ReplyTimeout, + TLS: tpDPH.Conn.TLS, + ClientKey: tpDPH.Conn.ClientKey, + ClientCertificate: tpDPH.Conn.ClientCertificate, + CaCertificate: tpDPH.Conn.CaCertificate, }, } } @@ -2860,9 +2893,17 @@ func DispatcherHostToAPI(dph *DispatcherHost) (tpDPH *utils.TPDispatcherHost) { Tenant: dph.Tenant, ID: dph.ID, Conn: &utils.TPDispatcherHostConn{ - Address: dph.Address, - Transport: dph.Transport, - TLS: dph.TLS, + Address: dph.Address, + Transport: dph.Transport, + Synchronous: dph.Synchronous, + ConnectAttempts: dph.ConnectAttempts, + Reconnects: dph.Reconnects, + ConnectTimeout: dph.ConnectTimeout, + ReplyTimeout: dph.ReplyTimeout, + TLS: dph.TLS, + ClientKey: dph.ClientKey, + ClientCertificate: dph.ClientCertificate, + CaCertificate: dph.CaCertificate, }, } } diff --git a/engine/model_helpers_test.go b/engine/model_helpers_test.go index 39706c84e..b78630607 100644 --- a/engine/model_helpers_test.go +++ b/engine/model_helpers_test.go @@ -3764,7 +3764,7 @@ func TestAPItoModelTPDispatcher(t *testing.T) { func TestTPDispatcherHostsCSVHeader(t *testing.T) { tps := &DispatcherHostMdls{} - eOut := []string{"#" + utils.Tenant, utils.ID, utils.Address, utils.Transport, utils.TLS} + eOut := []string{"#" + utils.Tenant, utils.ID, utils.Address, utils.Transport, utils.SynchronousCfg, utils.ConnectAttemptsCfg, utils.ReconnectsCfg, utils.ConnectTimeoutCfg, utils.ReplyTimeoutCfg, utils.TLS, utils.ClientKeyCfg, utils.ClientCerificateCfg, utils.CaCertificateCfg} if rcv := tps.CSVHeader(); !reflect.DeepEqual(rcv, eOut) { t.Errorf("Expecting: %+v,\nReceived: %+v", utils.ToJSON(eOut), utils.ToJSON(rcv)) } @@ -3772,7 +3772,9 @@ func TestTPDispatcherHostsCSVHeader(t *testing.T) { func TestTPDispatcherHostsAsTPDispatcherHosts(t *testing.T) { tps := &DispatcherHostMdls{} - if rcv := tps.AsTPDispatcherHosts(); rcv != nil { + if rcv, err := tps.AsTPDispatcherHosts(); err != nil { + t.Error(err) + } else if rcv != nil { t.Errorf("Expecting: nil,\nReceived: %+v", utils.ToJSON(rcv)) } @@ -3781,28 +3783,50 @@ func TestTPDispatcherHostsAsTPDispatcherHosts(t *testing.T) { ID: "ID1", Tenant: "Tenant1", }} - if rcv := tps.AsTPDispatcherHosts(); rcv != nil { + if rcv, err := tps.AsTPDispatcherHosts(); err != nil { + t.Error(err) + } else if rcv != nil { t.Errorf("Expecting: nil,\nReceived: %+v", utils.ToJSON(rcv)) } tps = &DispatcherHostMdls{ &DispatcherHostMdl{ - Address: "Address1", - ID: "ID1", - Tenant: "Tenant1", - Transport: utils.EmptyString, + ID: "ID1", + Tenant: "Tenant1", + Address: "localhost:6012", + Transport: "*json", + Synchronous: true, + ConnectAttempts: 2, + Reconnects: 5, + ConnectTimeout: "2m", + ReplyTimeout: "1m", + TLS: true, + ClientKey: "client_key", + ClientCertificate: "client_certificate", + CaCertificate: "ca_certificate", }} eOut := []*utils.TPDispatcherHost{ { Tenant: "Tenant1", ID: "ID1", Conn: &utils.TPDispatcherHostConn{ - Address: "Address1", - Transport: "*json", + Address: "localhost:6012", + Transport: "*json", + Synchronous: true, + ConnectAttempts: 2, + Reconnects: 5, + ConnectTimeout: 2 * time.Minute, + ReplyTimeout: 1 * time.Minute, + TLS: true, + ClientKey: "client_key", + ClientCertificate: "client_certificate", + CaCertificate: "ca_certificate", }, }, } - if rcv := tps.AsTPDispatcherHosts(); !reflect.DeepEqual(rcv, eOut) { + if rcv, err := tps.AsTPDispatcherHosts(); err != nil { + t.Error(err) + } else if !reflect.DeepEqual(rcv, eOut) { t.Errorf("Expecting: %+v,\nReceived: %+v", utils.ToJSON(eOut), utils.ToJSON(rcv)) } @@ -3823,7 +3847,9 @@ func TestTPDispatcherHostsAsTPDispatcherHosts(t *testing.T) { }, }, } - if rcv := tps.AsTPDispatcherHosts(); !reflect.DeepEqual(rcv, eOut) { + if rcv, err := tps.AsTPDispatcherHosts(); err != nil { + t.Error(err) + } else if !reflect.DeepEqual(rcv, eOut) { t.Errorf("Expecting: %+v,\nReceived: %+v", utils.ToJSON(eOut), utils.ToJSON(rcv)) } @@ -3845,7 +3871,9 @@ func TestTPDispatcherHostsAsTPDispatcherHosts(t *testing.T) { }, }, } - if rcv := tps.AsTPDispatcherHosts(); !reflect.DeepEqual(rcv, eOut) { + if rcv, err := tps.AsTPDispatcherHosts(); err != nil { + t.Error(err) + } else if !reflect.DeepEqual(rcv, eOut) { t.Errorf("Expecting: %+v,\nReceived: %+v", utils.ToJSON(eOut), utils.ToJSON(rcv)) } @@ -3867,7 +3895,10 @@ func TestTPDispatcherHostsAsTPDispatcherHosts(t *testing.T) { }, }, } - rcv := tps.AsTPDispatcherHosts() + rcv, err := tps.AsTPDispatcherHosts() + if err != nil { + t.Error(err) + } sort.Slice(rcv, func(i, j int) bool { return strings.Compare(rcv[i].ID, rcv[j].ID) < 0 }) if !reflect.DeepEqual(rcv, eOut) { t.Errorf("Expecting: %+v,\nReceived: %+v", utils.ToJSON(eOut), utils.ToJSON(rcv)) @@ -3884,15 +3915,33 @@ func TestAPItoModelTPDispatcherHost(t *testing.T) { Tenant: "Tenant", ID: "ID", Conn: &utils.TPDispatcherHostConn{ - Address: "Address1", - Transport: "*json", + Address: "Address1", + Transport: "*json", + Synchronous: true, + ConnectAttempts: 3, + Reconnects: 5, + ConnectTimeout: 1 * time.Minute, + ReplyTimeout: 2 * time.Minute, + TLS: true, + ClientKey: "client_key", + ClientCertificate: "client_certificate", + CaCertificate: "ca_certificate", }, } eOut := &DispatcherHostMdl{ - Address: "Address1", - Transport: "*json", - Tenant: "Tenant", - ID: "ID", + Address: "Address1", + Transport: "*json", + Tenant: "Tenant", + ID: "ID", + Synchronous: true, + ConnectAttempts: 3, + Reconnects: 5, + ConnectTimeout: "1m0s", + ReplyTimeout: "2m0s", + TLS: true, + ClientKey: "client_key", + ClientCertificate: "client_certificate", + CaCertificate: "ca_certificate", } if rcv := APItoModelTPDispatcherHost(tpDPH); !reflect.DeepEqual(eOut, rcv) { t.Errorf("Expecting: %+v,\nReceived: %+v", utils.ToJSON(eOut), utils.ToJSON(rcv)) @@ -3910,17 +3959,35 @@ func TestAPItoDispatcherHost(t *testing.T) { Tenant: "Tenant1", ID: "ID1", Conn: &utils.TPDispatcherHostConn{ - Address: "Address1", - Transport: "*json", + Address: "localhost:6012", + Transport: "*json", + Synchronous: true, + ConnectAttempts: 3, + Reconnects: 5, + ConnectTimeout: 1 * time.Minute, + ReplyTimeout: 2 * time.Minute, + TLS: true, + ClientKey: "client_key", + ClientCertificate: "client_certificate", + CaCertificate: "ca_certificate", }, } eOut := &DispatcherHost{ Tenant: "Tenant1", RemoteHost: &config.RemoteHost{ - ID: "ID1", - Address: "Address1", - Transport: "*json", + ID: "ID1", + Address: "localhost:6012", + Transport: "*json", + Synchronous: true, + Reconnects: 5, + ConnectTimeout: 1 * time.Minute, + ReplyTimeout: 2 * time.Minute, + TLS: true, + ClientKey: "client_key", + ClientCertificate: "client_certificate", + CaCertificate: "ca_certificate", + ConnectAttempts: 3, }, } if rcv := APItoDispatcherHost(tpDPH); !reflect.DeepEqual(eOut, rcv) { @@ -3954,19 +4021,33 @@ func TestDispatcherHostToAPI(t *testing.T) { dph := &DispatcherHost{ Tenant: "Tenant1", RemoteHost: &config.RemoteHost{ - ID: "ID1", - Address: "Address1", - Transport: "*json", - TLS: true, + Address: "127.0.0.1:2012", + Transport: "*json", + Synchronous: false, + ConnectAttempts: 0, + Reconnects: 0, + ConnectTimeout: 1 * time.Minute, + ReplyTimeout: 1 * time.Minute, + TLS: false, + ClientKey: "", + ClientCertificate: "", + CaCertificate: "", }, } eOut := &utils.TPDispatcherHost{ Tenant: "Tenant1", - ID: "ID1", Conn: &utils.TPDispatcherHostConn{ - Address: "Address1", - Transport: "*json", - TLS: true, + Address: "127.0.0.1:2012", + Transport: "*json", + Synchronous: false, + ConnectAttempts: 0, + Reconnects: 0, + ConnectTimeout: 1 * time.Minute, + ReplyTimeout: 1 * time.Minute, + TLS: false, + ClientKey: "", + ClientCertificate: "", + CaCertificate: "", }, } if rcv := DispatcherHostToAPI(dph); !reflect.DeepEqual(eOut, rcv) { diff --git a/engine/models.go b/engine/models.go index ebaf0aa7f..73c8e3811 100644 --- a/engine/models.go +++ b/engine/models.go @@ -496,14 +496,22 @@ func (DispatcherProfileMdl) TableName() string { } type DispatcherHostMdl struct { - PK uint `gorm:"primary_key"` - Tpid string // - Tenant string `index:"0" re:""` - ID string `index:"1" re:""` - Address string `index:"2" re:""` - Transport string `index:"3" re:""` - TLS bool `index:"4" re:""` - CreatedAt time.Time + PK uint `gorm:"primary_key"` + Tpid string // + Tenant string `index:"0" re:""` + ID string `index:"1" re:""` + Address string `index:"2" re:""` + Transport string `index:"3" re:""` + Synchronous bool `index:"4" re:""` + ConnectAttempts int `index:"5" re:""` + Reconnects int `index:"6" re:""` + ConnectTimeout string `index:"7" re:""` + ReplyTimeout string `index:"8" re:""` + TLS bool `index:"9" re:""` + ClientKey string `index:"10" re:""` + ClientCertificate string `index:"11" re:""` + CaCertificate string `index:"12" re:""` + CreatedAt time.Time } func (DispatcherHostMdl) TableName() string { diff --git a/engine/storage_csv.go b/engine/storage_csv.go index 71fca5e98..818468b62 100644 --- a/engine/storage_csv.go +++ b/engine/storage_csv.go @@ -637,7 +637,11 @@ func (csvs *CSVStorage) GetTPDispatcherHosts(tpid, tenant, id string) ([]*utils. }); err != nil { return nil, err } - return tpDDHs.AsTPDispatcherHosts(), nil + result, err := tpDDHs.AsTPDispatcherHosts() + if err != nil { + return nil, err + } + return result, nil } func (csvs *CSVStorage) GetTpIds(colName string) ([]string, error) { diff --git a/engine/storage_sql.go b/engine/storage_sql.go index e9d3cebae..524591252 100644 --- a/engine/storage_sql.go +++ b/engine/storage_sql.go @@ -1544,7 +1544,10 @@ func (sqls *SQLStorage) GetTPDispatcherHosts(tpid, tenant, id string) ([]*utils. if err := q.Find(&dpps).Error; err != nil { return nil, err } - arls := dpps.AsTPDispatcherHosts() + arls, err := dpps.AsTPDispatcherHosts() + if err != nil { + return nil, err + } if len(arls) == 0 { return arls, utils.ErrNotFound } diff --git a/loaders/loader.go b/loaders/loader.go index 83af6d6e0..48f3f87d3 100644 --- a/loaders/loader.go +++ b/loaders/loader.go @@ -521,7 +521,11 @@ func (ldr *Loader) storeLoadedData(loaderType string, return } } - for _, tpDsp := range dispModels.AsTPDispatcherHosts() { + tpDsps, err := dispModels.AsTPDispatcherHosts() + if err != nil { + return err + } + for _, tpDsp := range tpDsps { dsp := engine.APItoDispatcherHost(tpDsp) if ldr.dryRun { utils.Logger.Info( diff --git a/loaders/loader_test.go b/loaders/loader_test.go index 0d216b85e..695f07d32 100644 --- a/loaders/loader_test.go +++ b/loaders/loader_test.go @@ -1285,11 +1285,67 @@ func TestLoaderProcessDispatcheHosts(t *testing.T) { Value: config.NewRSRParsersMustCompile("~*req.3", utils.InfieldSep), }, { - Tag: "TLS", - Path: "TLS", + Tag: "Synchronous", + Path: "Synchronous", Type: utils.MetaComposed, Value: config.NewRSRParsersMustCompile("~*req.4", utils.InfieldSep), }, + { + Tag: "ConnectAttempts", + Path: "ConnectAttempts", + Type: utils.MetaComposed, + Value: config.NewRSRParsersMustCompile("~*req.5", utils.InfieldSep), + Mandatory: true, + }, + { + Tag: "Reconnects", + Path: "Reconnects", + Type: utils.MetaComposed, + Value: config.NewRSRParsersMustCompile("~*req.6", utils.InfieldSep), + Mandatory: true, + }, + { + Tag: "ConnectTimeout", + Path: "ConnectTimeout", + Type: utils.MetaComposed, + Value: config.NewRSRParsersMustCompile("~*req.7", utils.InfieldSep), + Mandatory: true, + }, + { + Tag: "ReplyTimeout", + Path: "ReplyTimeout", + Type: utils.MetaComposed, + Value: config.NewRSRParsersMustCompile("~*req.8", utils.InfieldSep), + Mandatory: true, + }, + { + Tag: "TLS", + Path: "TLS", + Type: utils.MetaComposed, + Value: config.NewRSRParsersMustCompile("~*req.9", utils.InfieldSep), + Mandatory: true, + }, + { + Tag: "ClientKey", + Path: "ClientKey", + Type: utils.MetaComposed, + Value: config.NewRSRParsersMustCompile("~*req.10", utils.InfieldSep), + Mandatory: true, + }, + { + Tag: "ClientCertificate", + Path: "ClientCertificate", + Type: utils.MetaComposed, + Value: config.NewRSRParsersMustCompile("~*req.11", utils.InfieldSep), + Mandatory: true, + }, + { + Tag: "CaCertificate", + Path: "CaCertificate", + Type: utils.MetaComposed, + Value: config.NewRSRParsersMustCompile("~*req.12", utils.InfieldSep), + Mandatory: true, + }, }, } rdr := io.NopCloser(strings.NewReader(engine.DispatcherHostCSVContent)) @@ -1313,14 +1369,22 @@ func TestLoaderProcessDispatcheHosts(t *testing.T) { eDispHost := &engine.DispatcherHost{ Tenant: "cgrates.org", RemoteHost: &config.RemoteHost{ - ID: "ALL1", - Address: "127.0.0.1:2012", - Transport: utils.MetaJSON, - TLS: true, + ID: "ALL", + Address: "127.0.0.1:6012", + Transport: utils.MetaJSON, + Synchronous: false, + ConnectAttempts: 1, + Reconnects: 3, + ConnectTimeout: 1 * time.Minute, + ReplyTimeout: 2 * time.Minute, + TLS: true, + ClientKey: "key2", + ClientCertificate: "cert2", + CaCertificate: "ca_cert2", }, } - rcv, err := ldr.dm.GetDispatcherHost("cgrates.org", "ALL1", + rcv, err := ldr.dm.GetDispatcherHost("cgrates.org", "ALL", true, false, utils.NonTransactional) if err != nil { t.Fatal(err) diff --git a/utils/apitpdata.go b/utils/apitpdata.go index 1970da87b..17f641271 100644 --- a/utils/apitpdata.go +++ b/utils/apitpdata.go @@ -1144,9 +1144,17 @@ type TPDispatcherHost struct { // TPDispatcherHostConn is used in TPDispatcherHost type TPDispatcherHostConn struct { - Address string - Transport string - TLS bool + Address string + Transport string + Synchronous bool + ConnectAttempts int + Reconnects int + ConnectTimeout time.Duration + ReplyTimeout time.Duration + TLS bool + ClientKey string + ClientCertificate string + CaCertificate string } type UsageInterval struct {