cfg: add ips_conns to sessions section

This commit is contained in:
ionutboangiu
2025-11-25 12:01:08 +02:00
committed by Dan Christian Bogos
parent 84a4043e9a
commit 292b97aa5b
10 changed files with 54 additions and 4 deletions

View File

@@ -667,6 +667,7 @@ const CGRATES_CFG_JSON = `
"chargers_conns": [], // connections to ChargerS for session forking <""|*internal|$rpc_conns_id>
"rals_conns": [], // connections to RALs for rating/accounting <""|*internal|$rpc_conns_id>
"cdrs_conns": [], // connections to CDRs for CDR posting <""|*internal|$rpc_conns_id>
"ips_conns": [], // connections to IPs for monitoring ip usage <""|*internal|$rpc_conns_id>
"resources_conns": [], // connections to ResourceS for resources monitoring <""|*internal|$rpc_conns_id>
"thresholds_conns": [], // connections to ThresholdS for reporting session events <""|*internal|$rpc_conns_id>
"stats_conns": [], // connections to StatS for reporting session events <""|*internal|$rpc_conns_id>

View File

@@ -527,6 +527,7 @@ func testCGRConfigReloadSessionS(t *testing.T) {
ListenBijson: "127.0.0.1:2014",
ChargerSConns: []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaChargers)},
RALsConns: []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaResponder)},
IPsConns: []string{},
ResSConns: []string{utils.MetaLocalHost},
ThreshSConns: []string{},
StatSConns: []string{},
@@ -963,6 +964,7 @@ func testCGRConfigReloadConfigFromJSONSessionS(t *testing.T) {
Config: map[string]any{
"sessions": map[string]any{
"enabled": true,
"ips_conns": []string{"*localhost"},
"resources_conns": []string{"*localhost"},
"routes_conns": []string{"*localhost"},
"attributes_conns": []string{"*localhost"},
@@ -981,6 +983,7 @@ func testCGRConfigReloadConfigFromJSONSessionS(t *testing.T) {
ListenBijson: "127.0.0.1:2014",
ChargerSConns: []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaChargers)},
RALsConns: []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaResponder)},
IPsConns: []string{utils.MetaLocalHost},
ResSConns: []string{utils.MetaLocalHost},
ThreshSConns: []string{},
StatSConns: []string{},
@@ -1025,6 +1028,7 @@ func testCGRConfigReloadConfigFromStringSessionS(t *testing.T) {
Config: `{
"sessions":{
"enabled": true,
"ips_conns": ["*localhost"],
"resources_conns": ["*localhost"],
"routes_conns": ["*localhost"],
"attributes_conns": ["*localhost"],
@@ -1042,6 +1046,7 @@ func testCGRConfigReloadConfigFromStringSessionS(t *testing.T) {
ListenBijson: "127.0.0.1:2014",
ChargerSConns: []string{utils.MetaLocalHost},
RALsConns: []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaResponder)},
IPsConns: []string{utils.MetaLocalHost},
ResSConns: []string{utils.MetaLocalHost},
ThreshSConns: []string{},
StatSConns: []string{},
@@ -1072,7 +1077,7 @@ func testCGRConfigReloadConfigFromStringSessionS(t *testing.T) {
}
var rcv string
expected := `{"sessions":{"alterable_fields":[],"attributes_conns":["*localhost"],"backup_interval":"0","cdrs_conns":["*internal"],"channel_sync_interval":"0","chargers_conns":["*localhost"],"client_protocol":2,"debit_interval":"0","default_usage":{"*any":"3h0m0s","*data":"1048576","*sms":"1","*voice":"3h0m0s"},"enabled":true,"listen_bigob":"","listen_bijson":"127.0.0.1:2014","min_dur_low_balance":"0","rals_conns":["*internal"],"replication_conns":[],"resources_conns":["*localhost"],"routes_conns":["*localhost"],"scheduler_conns":[],"session_indexes":[],"session_ttl":"0","stale_chan_max_extra_usage":"0","stats_conns":[],"stir":{"allowed_attest":["*any"],"default_attest":"A","payload_maxduration":"-1","privatekey_path":"","publickey_path":""},"store_session_costs":false,"terminate_attempts":5,"thresholds_conns":[]}}`
expected := `{"sessions":{"alterable_fields":[],"attributes_conns":["*localhost"],"backup_interval":"0","cdrs_conns":["*internal"],"channel_sync_interval":"0","chargers_conns":["*localhost"],"client_protocol":2,"debit_interval":"0","default_usage":{"*any":"3h0m0s","*data":"1048576","*sms":"1","*voice":"3h0m0s"},"enabled":true,"ips_conns":["*localhost"],"listen_bigob":"","listen_bijson":"127.0.0.1:2014","min_dur_low_balance":"0","rals_conns":["*internal"],"replication_conns":[],"resources_conns":["*localhost"],"routes_conns":["*localhost"],"scheduler_conns":[],"session_indexes":[],"session_ttl":"0","stale_chan_max_extra_usage":"0","stats_conns":[],"stir":{"allowed_attest":["*any"],"default_attest":"A","payload_maxduration":"-1","privatekey_path":"","publickey_path":""},"store_session_costs":false,"terminate_attempts":5,"thresholds_conns":[]}}`
if err := cfg.V1GetConfigAsJSON(context.Background(), &SectionWithAPIOpts{Section: SessionSJson}, &rcv); err != nil {
t.Error(err)
@@ -1104,6 +1109,7 @@ func testCGRConfigReloadAll(t *testing.T) {
ListenBijson: "127.0.0.1:2014",
ChargerSConns: []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaChargers)},
RALsConns: []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaResponder)},
IPsConns: []string{},
ResSConns: []string{utils.MetaLocalHost},
ThreshSConns: []string{},
StatSConns: []string{},

View File

@@ -944,6 +944,7 @@ func TestSmgJsonCfg(t *testing.T) {
Chargers_conns: &[]string{},
Rals_conns: &[]string{},
Cdrs_conns: &[]string{},
Ips_conns: &[]string{},
Resources_conns: &[]string{},
Thresholds_conns: &[]string{},
Stats_conns: &[]string{},

File diff suppressed because one or more lines are too long

View File

@@ -185,6 +185,14 @@ func (cfg *CGRConfig) checkConfigSanity() error {
return fmt.Errorf("<%s> connection with id: <%s> not defined", utils.SessionS, connID)
}
}
for _, connID := range cfg.sessionSCfg.IPsConns {
if strings.HasPrefix(connID, utils.MetaInternal) && !cfg.ipsCfg.Enabled {
return fmt.Errorf("<%s> not enabled but requested by <%s> component", utils.IPs, utils.SessionS)
}
if _, has := cfg.rpcConns[connID]; !has && !strings.HasPrefix(connID, utils.MetaInternal) {
return fmt.Errorf("<%s> connection with id: <%s> not defined", utils.SessionS, connID)
}
}
for _, connID := range cfg.sessionSCfg.ResSConns {
if strings.HasPrefix(connID, utils.MetaInternal) && !cfg.resourceSCfg.Enabled {
return fmt.Errorf("<%s> not enabled but requested by <%s> component", utils.ResourceS, utils.SessionS)

View File

@@ -299,6 +299,19 @@ func TestConfigSanitySessionS(t *testing.T) {
cfg.sessionSCfg.ResSConns = []string{}
cfg.resourceSCfg.Enabled = true
cfg.sessionSCfg.IPsConns = []string{utils.MetaInternal}
expected = "<IPs> not enabled but requested by <SessionS> component"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("expected %q, received: %q", expected, err)
}
cfg.sessionSCfg.IPsConns = []string{"test"}
expected = "<SessionS> connection with id: <test> not defined"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {
t.Errorf("Expecting: %+q received: %+q", expected, err)
}
cfg.sessionSCfg.IPsConns = []string{}
cfg.ipsCfg.Enabled = true
cfg.sessionSCfg.ThreshSConns = []string{utils.MetaInternal}
expected = "<ThresholdS> not enabled but requested by <SessionS> component"
if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected {

View File

@@ -418,6 +418,7 @@ type SessionSJsonCfg struct {
Listen_bigob *string
Chargers_conns *[]string
Rals_conns *[]string
Ips_conns *[]string
Resources_conns *[]string
Thresholds_conns *[]string
Stats_conns *[]string

View File

@@ -20,6 +20,7 @@ package config
import (
"fmt"
"slices"
"strconv"
"time"
@@ -108,6 +109,7 @@ type SessionSCfg struct {
ListenBigob string
ChargerSConns []string
RALsConns []string
IPsConns []string
ResSConns []string
ThreshSConns []string
StatSConns []string
@@ -168,6 +170,9 @@ func (scfg *SessionSCfg) loadFromJSONCfg(jsnCfg *SessionSJsonCfg) (err error) {
}
}
}
if jsnCfg.Ips_conns != nil {
scfg.IPsConns = tagInternalConns(*jsnCfg.Ips_conns, utils.MetaIPs)
}
if jsnCfg.Resources_conns != nil {
scfg.ResSConns = make([]string, len(*jsnCfg.Resources_conns))
for idx, connID := range *jsnCfg.Resources_conns {
@@ -352,6 +357,7 @@ func (scfg *SessionSCfg) AsMapInterface() (initialMP map[string]any) {
utils.ListenBijsonCfg: scfg.ListenBijson,
utils.ListenBigobCfg: scfg.ListenBigob,
utils.ReplicationConnsCfg: scfg.ReplicationConns,
utils.IPsConnsCfg: stripInternalConns(scfg.IPsConns),
utils.StoreSCostsCfg: scfg.StoreSCosts,
utils.SessionIndexesCfg: scfg.SessionIndexes.AsSlice(),
utils.ClientProtocolCfg: scfg.ClientProtocol,
@@ -495,6 +501,7 @@ func (scfg SessionSCfg) Clone() (cln *SessionSCfg) {
cln = &SessionSCfg{
Enabled: scfg.Enabled,
ListenBijson: scfg.ListenBijson,
IPsConns: slices.Clone(scfg.IPsConns),
DebitInterval: scfg.DebitInterval,
StoreSCosts: scfg.StoreSCosts,
SessionTTL: scfg.SessionTTL,

View File

@@ -71,6 +71,7 @@ func TestSessionSCfgloadFromJsonCfgCase1(t *testing.T) {
Listen_bijson: utils.StringPointer("127.0.0.1:2018"),
Chargers_conns: &[]string{utils.MetaInternal, "*conn1"},
Rals_conns: &[]string{utils.MetaInternal, "*conn1"},
Ips_conns: &[]string{utils.MetaInternal, "*conn1"},
Resources_conns: &[]string{utils.MetaInternal, "*conn1"},
Thresholds_conns: &[]string{utils.MetaInternal, "*conn1"},
Stats_conns: &[]string{utils.MetaInternal, "*conn1"},
@@ -101,6 +102,7 @@ func TestSessionSCfgloadFromJsonCfgCase1(t *testing.T) {
ListenBijson: "127.0.0.1:2018",
ChargerSConns: []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaChargers), "*conn1"},
RALsConns: []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaResponder), "*conn1"},
IPsConns: []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaIPs), "*conn1"},
ResSConns: []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaResources), "*conn1"},
ThreshSConns: []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaThresholds), "*conn1"},
StatSConns: []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaStats), "*conn1"},
@@ -239,6 +241,7 @@ func TestSessionSCfgloadFromJsonCfgCase10(t *testing.T) {
ListenBijson: "127.0.0.1:2014",
ChargerSConns: []string{},
RALsConns: []string{},
IPsConns: []string{},
ResSConns: []string{},
ThreshSConns: []string{},
StatSConns: []string{},
@@ -351,6 +354,7 @@ func TestSessionSCfgAsMapInterfaceCase1(t *testing.T) {
utils.ChargerSConnsCfg: []string{},
utils.RALsConnsCfg: []string{},
utils.CDRsConnsCfg: []string{},
utils.IPsConnsCfg: []string{},
utils.ResourceSConnsCfg: []string{},
utils.ThresholdSConnsCfg: []string{},
utils.StatSConnsCfg: []string{},
@@ -402,6 +406,7 @@ func TestSessionSCfgAsMapInterfaceCase2(t *testing.T) {
"chargers_conns": ["*internal:*chargers", "*conn1"],
"rals_conns": ["*internal:*responder", "*conn1"],
"cdrs_conns": ["*internal:*cdrs", "*conn1"],
"ips_conns": ["*internal:*ips", "*conn1"],
"resources_conns": ["*internal:*resources", "*conn1"],
"thresholds_conns": ["*internal:*thresholds", "*conn1"],
"stats_conns": ["*internal:*stats", "*conn1"],
@@ -431,6 +436,7 @@ func TestSessionSCfgAsMapInterfaceCase2(t *testing.T) {
utils.ChargerSConnsCfg: []string{utils.MetaInternal, "*conn1"},
utils.RALsConnsCfg: []string{utils.MetaInternal, "*conn1"},
utils.CDRsConnsCfg: []string{utils.MetaInternal, "*conn1"},
utils.IPsConnsCfg: []string{utils.MetaInternal, "*conn1"},
utils.ResourceSConnsCfg: []string{utils.MetaInternal, "*conn1"},
utils.ThresholdSConnsCfg: []string{utils.MetaInternal, "*conn1"},
utils.StatSConnsCfg: []string{utils.MetaInternal, "*conn1"},
@@ -947,6 +953,7 @@ func TestSessionSCfgClone(t *testing.T) {
ListenBijson: "127.0.0.1:2018",
ChargerSConns: []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaChargers), "*conn1"},
RALsConns: []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaResponder), "*conn1"},
IPsConns: []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaIPs), "*conn1"},
ResSConns: []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaResources), "*conn1"},
ThreshSConns: []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaThresholds), "*conn1"},
StatSConns: []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaStats), "*conn1"},
@@ -993,6 +1000,9 @@ func TestSessionSCfgClone(t *testing.T) {
if rcv.RALsConns[1] = ""; ban.RALsConns[1] != "*conn1" {
t.Errorf("Expected clone to not modify the cloned")
}
if rcv.IPsConns[1] = ""; ban.IPsConns[1] != "*conn1" {
t.Errorf("Expected clone to not modify the cloned")
}
if rcv.ResSConns[1] = ""; ban.ResSConns[1] != "*conn1" {
t.Errorf("Expected clone to not modify the cloned")
}
@@ -1014,7 +1024,6 @@ func TestSessionSCfgClone(t *testing.T) {
if rcv.ReplicationConns[0] = ""; ban.ReplicationConns[0] != "*conn1" {
t.Errorf("Expected clone to not modify the cloned")
}
if rcv.STIRCfg.DefaultAttest = ""; ban.STIRCfg.DefaultAttest != "A" {
t.Errorf("Expected clone to not modify the cloned")
}

View File

@@ -2526,6 +2526,7 @@ const (
ListenBijsonCfg = "listen_bijson"
ListenBigobCfg = "listen_bigob"
RALsConnsCfg = "rals_conns"
IPsConnsCfg = "ips_conns"
ResSConnsCfg = "resources_conns"
ThreshSConnsCfg = "thresholds_conns"
RouteSConnsCfg = "routes_conns"