cfg: add stats/thresholds_conns to dns_agent

This commit is contained in:
ionutboangiu
2025-06-17 18:59:22 +03:00
committed by Dan Christian Bogos
parent b0fc13896d
commit add2ee1971
7 changed files with 132 additions and 71 deletions

View File

@@ -1066,6 +1066,8 @@ const CGRATES_CFG_JSON = `
}
],
"sessions_conns": ["*internal"],
"stats_conns": [], // connections to StatS, empty to disable: <""|*internal|$rpc_conns_id>
"thresholds_conns": [], // connections to ThresholdS, empty to disable: <""|*internal|$rpc_conns_id>
"timezone": "", // timezone of the events if not specified <UTC|Local|$IANA_TZ_DB>
"request_processors": [] // request processors to be applied to DNS messages
},

View File

@@ -548,7 +548,9 @@ func testCGRConfigReloadDNSAgent(t *testing.T) {
Network: "tcp",
},
},
SessionSConns: []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaSessionS)},
SessionSConns: []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaSessionS)},
StatSConns: []string{},
ThresholdSConns: []string{},
// Timezone string
// RequestProcessors []*RequestProcessor
}

View File

@@ -813,9 +813,11 @@ func TestDNSAgentJsonCfg(t *testing.T) {
},
},
Sessions_conns: &[]string{utils.ConcatenatedKey(utils.MetaInternal)},
Timezone: utils.StringPointer(""),
Request_processors: &[]*ReqProcessorJsnCfg{},
SessionSConns: &[]string{utils.ConcatenatedKey(utils.MetaInternal)},
StatSConns: &[]string{},
ThresholdSConns: &[]string{},
Timezone: utils.StringPointer(""),
RequestProcessors: &[]*ReqProcessorJsnCfg{},
}
dfCgrJSONCfg, err := NewCgrJsonCfgFromBytes([]byte(CGRATES_CFG_JSON))
if err != nil {

File diff suppressed because one or more lines are too long

View File

@@ -443,6 +443,22 @@ func (cfg *CGRConfig) checkConfigSanity() error {
return fmt.Errorf("<%s> connection with id: <%s> not defined", utils.DNSAgent, connID)
}
}
for _, connID := range cfg.dnsAgentCfg.StatSConns {
if strings.HasPrefix(connID, utils.MetaInternal) && !cfg.statsCfg.Enabled {
return fmt.Errorf("<%s> not enabled but requested by <%s> component", utils.StatS, utils.DNSAgent)
}
if _, has := cfg.rpcConns[connID]; !has && !strings.HasPrefix(connID, utils.MetaInternal) {
return fmt.Errorf("<%s> connection with id: <%s> not defined", utils.DNSAgent, connID)
}
}
for _, connID := range cfg.dnsAgentCfg.ThresholdSConns {
if strings.HasPrefix(connID, utils.MetaInternal) && !cfg.thresholdSCfg.Enabled {
return fmt.Errorf("<%s> not enabled but requested by <%s> component", utils.ThresholdS, utils.DNSAgent)
}
if _, has := cfg.rpcConns[connID]; !has && !strings.HasPrefix(connID, utils.MetaInternal) {
return fmt.Errorf("<%s> connection with id: <%s> not defined", utils.DNSAgent, connID)
}
}
for _, req := range cfg.dnsAgentCfg.RequestProcessors {
for _, field := range req.RequestFields {
if field.Type != utils.MetaNone && field.Path == utils.EmptyString {

View File

@@ -35,6 +35,8 @@ type DNSAgentCfg struct {
Enabled bool
Listeners []Listener
SessionSConns []string
StatSConns []string
ThresholdSConns []string
Timezone string
RequestProcessors []*RequestProcessor
}
@@ -71,10 +73,16 @@ func (da *DNSAgentCfg) loadFromJSONCfg(jsnCfg *DNSAgentJsonCfg) (err error) {
if jsnCfg.Timezone != nil {
da.Timezone = *jsnCfg.Timezone
}
if jsnCfg.Sessions_conns != nil {
da.SessionSConns = tagInternalConns(*jsnCfg.Sessions_conns, utils.MetaSessionS)
if jsnCfg.SessionSConns != nil {
da.SessionSConns = tagInternalConns(*jsnCfg.SessionSConns, utils.MetaSessionS)
}
da.RequestProcessors, err = appendRequestProcessors(da.RequestProcessors, jsnCfg.Request_processors)
if jsnCfg.StatSConns != nil {
da.StatSConns = tagInternalConns(*jsnCfg.StatSConns, utils.MetaStats)
}
if jsnCfg.ThresholdSConns != nil {
da.ThresholdSConns = tagInternalConns(*jsnCfg.ThresholdSConns, utils.MetaThresholds)
}
da.RequestProcessors, err = appendRequestProcessors(da.RequestProcessors, jsnCfg.RequestProcessors)
return
}
@@ -87,25 +95,22 @@ func (lstn *Listener) AsMapInterface() map[string]any {
// AsMapInterface returns the config as a map[string]any
func (da DNSAgentCfg) AsMapInterface() any {
mp := map[string]any{
utils.EnabledCfg: da.Enabled,
utils.TimezoneCfg: da.Timezone,
}
listeners := make([]map[string]any, len(da.Listeners))
for i, item := range da.Listeners {
listeners[i] = item.AsMapInterface()
}
mp[utils.ListenersCfg] = listeners
requestProcessors := make([]map[string]any, len(da.RequestProcessors))
for i, item := range da.RequestProcessors {
requestProcessors[i] = item.AsMapInterface()
}
mp[utils.RequestProcessorsCfg] = requestProcessors
if da.SessionSConns != nil {
mp[utils.SessionSConnsCfg] = stripInternalConns(da.SessionSConns)
mp := map[string]any{
utils.EnabledCfg: da.Enabled,
utils.ListenersCfg: listeners,
utils.SessionSConnsCfg: stripInternalConns(da.SessionSConns),
utils.StatSConnsCfg: stripInternalConns(da.StatSConns),
utils.ThresholdSConnsCfg: stripInternalConns(da.ThresholdSConns),
utils.TimezoneCfg: da.Timezone,
utils.RequestProcessorsCfg: requestProcessors,
}
return mp
}
@@ -114,27 +119,22 @@ func (DNSAgentCfg) SName() string { return DNSAgentJSON }
func (da DNSAgentCfg) CloneSection() Section { return da.Clone() }
// Clone returns a deep copy of DNSAgentCfg
func (da DNSAgentCfg) Clone() (cln *DNSAgentCfg) {
cln = &DNSAgentCfg{
Enabled: da.Enabled,
Listeners: da.Listeners,
Timezone: da.Timezone,
}
if da.Listeners != nil {
cln.Listeners = make([]Listener, len(da.Listeners))
copy(cln.Listeners, da.Listeners)
}
if da.SessionSConns != nil {
cln.SessionSConns = slices.Clone(da.SessionSConns)
func (da DNSAgentCfg) Clone() *DNSAgentCfg {
clone := &DNSAgentCfg{
Enabled: da.Enabled,
Listeners: slices.Clone(da.Listeners),
SessionSConns: slices.Clone(da.SessionSConns),
StatSConns: slices.Clone(da.StatSConns),
ThresholdSConns: slices.Clone(da.ThresholdSConns),
Timezone: da.Timezone,
}
if da.RequestProcessors != nil {
cln.RequestProcessors = make([]*RequestProcessor, len(da.RequestProcessors))
clone.RequestProcessors = make([]*RequestProcessor, len(da.RequestProcessors))
for i, req := range da.RequestProcessors {
cln.RequestProcessors[i] = req.Clone()
clone.RequestProcessors[i] = req.Clone()
}
}
return
return clone
}
type ListenerJsnCfg struct {
@@ -144,11 +144,13 @@ type ListenerJsnCfg struct {
// DNSAgentJsonCfg
type DNSAgentJsonCfg struct {
Enabled *bool
Listeners *[]*ListenerJsnCfg
Sessions_conns *[]string
Timezone *string
Request_processors *[]*ReqProcessorJsnCfg
Enabled *bool `json:"enabled"`
Listeners *[]*ListenerJsnCfg `json:"listeners"`
SessionSConns *[]string `json:"sessions_conns"`
StatSConns *[]string `json:"stats_conns"`
ThresholdSConns *[]string `json:"thresholds_conns"`
Timezone *string `json:"timezone"`
RequestProcessors *[]*ReqProcessorJsnCfg `json:"request_processors"`
}
func diffDNSAgentJsonCfg(d *DNSAgentJsonCfg, v1, v2 *DNSAgentCfg) *DNSAgentJsonCfg {
@@ -159,14 +161,11 @@ func diffDNSAgentJsonCfg(d *DNSAgentJsonCfg, v1, v2 *DNSAgentCfg) *DNSAgentJsonC
d.Enabled = utils.BoolPointer(v2.Enabled)
}
minLen := len(v1.Listeners)
if len(v2.Listeners) < minLen {
minLen = len(v2.Listeners)
}
minLen := min(len(v2.Listeners), len(v1.Listeners))
diffListeners := &[]*ListenerJsnCfg{}
for i := 0; i < minLen; i++ {
for i := range minLen {
if v1.Listeners[i].Address != v2.Listeners[i].Address ||
v1.Listeners[i].Network != v2.Listeners[i].Network {
*diffListeners = append(*diffListeners, &ListenerJsnCfg{
@@ -197,11 +196,17 @@ func diffDNSAgentJsonCfg(d *DNSAgentJsonCfg, v1, v2 *DNSAgentCfg) *DNSAgentJsonC
d.Listeners = diffListeners
if !slices.Equal(v1.SessionSConns, v2.SessionSConns) {
d.Sessions_conns = utils.SliceStringPointer(stripInternalConns(v2.SessionSConns))
d.SessionSConns = utils.SliceStringPointer(stripInternalConns(v2.SessionSConns))
}
if !slices.Equal(v1.StatSConns, v2.StatSConns) {
d.StatSConns = utils.SliceStringPointer(stripInternalConns(v2.StatSConns))
}
if !slices.Equal(v1.ThresholdSConns, v2.ThresholdSConns) {
d.ThresholdSConns = utils.SliceStringPointer(stripInternalConns(v2.ThresholdSConns))
}
if v1.Timezone != v2.Timezone {
d.Timezone = utils.StringPointer(v2.Timezone)
}
d.Request_processors = diffReqProcessorsJsnCfg(d.Request_processors, v1.RequestProcessors, v2.RequestProcessors)
d.RequestProcessors = diffReqProcessorsJsnCfg(d.RequestProcessors, v1.RequestProcessors, v2.RequestProcessors)
return d
}

View File

@@ -33,9 +33,11 @@ func TestDNSAgentCfgloadFromJsonCfg(t *testing.T) {
Network: utils.StringPointer("udp"),
},
},
Sessions_conns: &[]string{utils.MetaInternal, "*conn1"},
Timezone: utils.StringPointer("UTC"),
Request_processors: &[]*ReqProcessorJsnCfg{
SessionSConns: &[]string{utils.MetaInternal, "*conn1"},
StatSConns: &[]string{utils.MetaInternal, "*conn1"},
ThresholdSConns: &[]string{utils.MetaInternal, "*conn1"},
Timezone: utils.StringPointer("UTC"),
RequestProcessors: &[]*ReqProcessorJsnCfg{
{
ID: utils.StringPointer("OutboundAUTHDryRun"),
Filters: &[]string{"*string:~*req.request_type:OutboundAUTH", "*string:~*req.Msisdn:497700056231"},
@@ -57,8 +59,10 @@ func TestDNSAgentCfgloadFromJsonCfg(t *testing.T) {
Network: "udp",
},
},
SessionSConns: []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaSessionS), "*conn1"},
Timezone: "UTC",
SessionSConns: []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaSessionS), "*conn1"},
StatSConns: []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaStats), "*conn1"},
ThresholdSConns: []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaThresholds), "*conn1"},
Timezone: "UTC",
RequestProcessors: []*RequestProcessor{
{
ID: "OutboundAUTHDryRun",
@@ -120,7 +124,7 @@ func TestRequestProcessorloadFromJsonCfg(t *testing.T) {
func TestRequestProcessorDNSAgentloadFromJsonCfg(t *testing.T) {
cfgJSON := &DNSAgentJsonCfg{
Request_processors: &[]*ReqProcessorJsnCfg{
RequestProcessors: &[]*ReqProcessorJsnCfg{
{
Tenant: utils.StringPointer("a{*"),
},
@@ -144,7 +148,7 @@ func TestRequestProcessorDNSAgentloadFromJsonCfg1(t *testing.T) {
}
}`
cfgJSON := &DNSAgentJsonCfg{
Request_processors: &[]*ReqProcessorJsnCfg{
RequestProcessors: &[]*ReqProcessorJsnCfg{
{
ID: utils.StringPointer("random"),
},
@@ -159,7 +163,7 @@ func TestRequestProcessorDNSAgentloadFromJsonCfg1(t *testing.T) {
func TestRequestProcessorReplyFieldsloadFromJsonCfg(t *testing.T) {
cfgJSON := &DNSAgentJsonCfg{
Request_processors: &[]*ReqProcessorJsnCfg{
RequestProcessors: &[]*ReqProcessorJsnCfg{
{
Reply_fields: &[]*FcTemplateJsonCfg{
{
@@ -179,7 +183,7 @@ func TestRequestProcessorReplyFieldsloadFromJsonCfg(t *testing.T) {
func TestRequestProcessorRequestFieldsloadFromJsonCfg(t *testing.T) {
cfgJSON := &DNSAgentJsonCfg{
Request_processors: &[]*ReqProcessorJsnCfg{
RequestProcessors: &[]*ReqProcessorJsnCfg{
{
Request_fields: &[]*FcTemplateJsonCfg{
{
@@ -207,6 +211,8 @@ func TestDNSAgentCfgAsMapInterface(t *testing.T) {
}
],
"sessions_conns": ["*internal"],
"stats_conns": ["*internal"],
"thresholds_conns": ["*internal"],
"timezone": "",
"request_processors": [],
},
@@ -218,6 +224,8 @@ func TestDNSAgentCfgAsMapInterface(t *testing.T) {
utils.NetworkCfg: "udp",
}},
utils.SessionSConnsCfg: []string{"*internal"},
utils.StatSConnsCfg: []string{"*internal"},
utils.ThresholdSConnsCfg: []string{"*internal"},
utils.TimezoneCfg: "",
utils.RequestProcessorsCfg: []map[string]any{},
}
@@ -239,6 +247,8 @@ func TestDNSAgentCfgAsMapInterface1(t *testing.T) {
}
],
"sessions_conns": ["*internal:*sessions", "*conn1"],
"stats_conns": ["*internal:*stats", "*conn1"],
"thresholds_conns": ["*internal:*thresholds", "*conn1"],
"timezone": "UTC",
"request_processors": [
{
@@ -272,8 +282,10 @@ func TestDNSAgentCfgAsMapInterface1(t *testing.T) {
utils.NetworkCfg: "udp",
},
},
utils.SessionSConnsCfg: []string{utils.MetaInternal, "*conn1"},
utils.TimezoneCfg: "UTC",
utils.SessionSConnsCfg: []string{utils.MetaInternal, "*conn1"},
utils.StatSConnsCfg: []string{utils.MetaInternal, "*conn1"},
utils.ThresholdSConnsCfg: []string{utils.MetaInternal, "*conn1"},
utils.TimezoneCfg: "UTC",
utils.RequestProcessorsCfg: []map[string]any{
{
utils.IDCfg: "OutboundAUTHDryRun",
@@ -332,8 +344,10 @@ func TestDNSAgentCfgClone(t *testing.T) {
Network: "udp",
},
},
SessionSConns: []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaSessionS), "*conn1"},
Timezone: "UTC",
SessionSConns: []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaSessionS), "*conn1"},
StatSConns: []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaStats), "*conn1"},
ThresholdSConns: []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaThresholds), "*conn1"},
Timezone: "UTC",
RequestProcessors: []*RequestProcessor{
{
ID: "OutboundAUTHDryRun",
@@ -354,6 +368,12 @@ func TestDNSAgentCfgClone(t *testing.T) {
if rcv.SessionSConns[1] = ""; ban.SessionSConns[1] != "*conn1" {
t.Errorf("Expected clone to not modify the cloned")
}
if rcv.StatSConns[1] = ""; ban.StatSConns[1] != "*conn1" {
t.Errorf("Expected clone to not modify the cloned")
}
if rcv.ThresholdSConns[1] = ""; ban.ThresholdSConns[1] != "*conn1" {
t.Errorf("Expected clone to not modify the cloned")
}
if rcv.RequestProcessors[0].ID = ""; ban.RequestProcessors[0].ID != "OutboundAUTHDryRun" {
t.Errorf("Expected clone to not modify the cloned")
}
@@ -371,6 +391,8 @@ func TestDiffDNSAgentJsonCfg(t *testing.T) {
},
},
SessionSConns: []string{"*localhost"},
StatSConns: []string{"*localhost"},
ThresholdSConns: []string{"*localhost"},
Timezone: "UTC",
RequestProcessors: []*RequestProcessor{},
}
@@ -383,8 +405,10 @@ func TestDiffDNSAgentJsonCfg(t *testing.T) {
Network: "udp",
},
},
SessionSConns: []string{"*birpc"},
Timezone: "EEST",
SessionSConns: []string{"*internal"},
StatSConns: []string{"*internal"},
ThresholdSConns: []string{"*internal"},
Timezone: "EEST",
RequestProcessors: []*RequestProcessor{
{
ID: "id",
@@ -400,9 +424,11 @@ func TestDiffDNSAgentJsonCfg(t *testing.T) {
Network: utils.StringPointer("udp"),
},
},
Sessions_conns: &[]string{"*birpc"},
Timezone: utils.StringPointer("EEST"),
Request_processors: &[]*ReqProcessorJsnCfg{
SessionSConns: &[]string{"*internal"},
StatSConns: &[]string{"*internal"},
ThresholdSConns: &[]string{"*internal"},
Timezone: utils.StringPointer("EEST"),
RequestProcessors: &[]*ReqProcessorJsnCfg{
{
ID: utils.StringPointer("id"),
},
@@ -416,8 +442,8 @@ func TestDiffDNSAgentJsonCfg(t *testing.T) {
v2_2 := v1
expected2 := &DNSAgentJsonCfg{
Listeners: &[]*ListenerJsnCfg{},
Request_processors: &[]*ReqProcessorJsnCfg{},
Listeners: &[]*ListenerJsnCfg{},
RequestProcessors: &[]*ReqProcessorJsnCfg{},
}
rcv = diffDNSAgentJsonCfg(d, v1, v2_2)
@@ -465,7 +491,7 @@ func TestDiffDNSAgentJsonCfgExtraV1(t *testing.T) {
Network: utils.StringPointer("udp"),
},
},
Request_processors: &[]*ReqProcessorJsnCfg{},
RequestProcessors: &[]*ReqProcessorJsnCfg{},
}
rcv := diffDNSAgentJsonCfg(d, v1, v2)
@@ -513,7 +539,7 @@ func TestDiffDNSAgentJsonCfgExtraV2(t *testing.T) {
Network: utils.StringPointer("udp"),
},
},
Request_processors: &[]*ReqProcessorJsnCfg{},
RequestProcessors: &[]*ReqProcessorJsnCfg{},
}
rcv := diffDNSAgentJsonCfg(d, v1, v2)
@@ -532,6 +558,8 @@ func TestDnsAgentCloneSection(t *testing.T) {
},
},
SessionSConns: []string{"*localhost"},
StatSConns: []string{"*localhost"},
ThresholdSConns: []string{"*localhost"},
Timezone: "UTC",
RequestProcessors: []*RequestProcessor{},
}
@@ -545,6 +573,8 @@ func TestDnsAgentCloneSection(t *testing.T) {
},
},
SessionSConns: []string{"*localhost"},
StatSConns: []string{"*localhost"},
ThresholdSConns: []string{"*localhost"},
Timezone: "UTC",
RequestProcessors: []*RequestProcessor{},
}