mirror of
https://github.com/cgrates/cgrates.git
synced 2026-02-11 18:16:24 +05:00
Updated eventReader default config
This commit is contained in:
committed by
Dan Christian Bogos
parent
96a22d5b7b
commit
73c4334bcb
@@ -318,17 +318,17 @@ const CGRATES_CFG_JSON = `
|
||||
"filters": [], // limit parsing based on the filters
|
||||
"flags": [], // flags to influence the event processing
|
||||
"fields":[ // import fields template, tag will match internally CDR field, in case of .csv value will be represented by index of the field value
|
||||
{"tag": "ToR", "path": "ToR", "type": "*variable", "value": "~*req.2", "mandatory": true},
|
||||
{"tag": "OriginID", "path": "OriginID", "type": "*variable", "value": "~*req.3", "mandatory": true},
|
||||
{"tag": "RequestType", "path": "RequestType", "type": "*variable", "value": "~*req.4", "mandatory": true},
|
||||
{"tag": "Tenant", "path": "Tenant", "type": "*variable", "value": "~*req.6", "mandatory": true},
|
||||
{"tag": "Category", "path": "Category", "type": "*variable", "value": "~*req.7", "mandatory": true},
|
||||
{"tag": "Account", "path": "Account", "type": "*variable", "value": "~*req.8", "mandatory": true},
|
||||
{"tag": "Subject", "path": "Subject", "type": "*variable", "value": "~*req.9", "mandatory": true},
|
||||
{"tag": "Destination", "path": "Destination", "type": "*variable", "value": "~*req.10", "mandatory": true},
|
||||
{"tag": "SetupTime", "path": "SetupTime", "type": "*variable", "value": "~*req.11", "mandatory": true},
|
||||
{"tag": "AnswerTime", "path": "AnswerTime", "type": "*variable", "value": "~*req.12", "mandatory": true},
|
||||
{"tag": "Usage", "path": "Usage", "type": "*variable", "value": "~*req.13", "mandatory": true},
|
||||
{"tag": "ToR", "path": "*cgreq.ToR", "type": "*variable", "value": "~*req.2", "mandatory": true},
|
||||
{"tag": "OriginID", "path": "*cgreq.OriginID", "type": "*variable", "value": "~*req.3", "mandatory": true},
|
||||
{"tag": "RequestType", "path": "*cgreq.RequestType", "type": "*variable", "value": "~*req.4", "mandatory": true},
|
||||
{"tag": "Tenant", "path": "*cgreq.Tenant", "type": "*variable", "value": "~*req.6", "mandatory": true},
|
||||
{"tag": "Category", "path": "*cgreq.Category", "type": "*variable", "value": "~*req.7", "mandatory": true},
|
||||
{"tag": "Account", "path": "*cgreq.Account", "type": "*variable", "value": "~*req.8", "mandatory": true},
|
||||
{"tag": "Subject", "path": "*cgreq.Subject", "type": "*variable", "value": "~*req.9", "mandatory": true},
|
||||
{"tag": "Destination", "path": "*cgreq.Destination", "type": "*variable", "value": "~*req.10", "mandatory": true},
|
||||
{"tag": "SetupTime", "path": "*cgreq.SetupTime", "type": "*variable", "value": "~*req.11", "mandatory": true},
|
||||
{"tag": "AnswerTime", "path": "*cgreq.AnswerTime", "type": "*variable", "value": "~*req.12", "mandatory": true},
|
||||
{"tag": "Usage", "path": "*cgreq.Usage", "type": "*variable", "value": "~*req.13", "mandatory": true},
|
||||
],
|
||||
"cache_dump_fields": [],
|
||||
},
|
||||
|
||||
@@ -262,6 +262,7 @@ func testCGRConfigReloadSupplierS(t *testing.T) {
|
||||
ResourceSConns: []string{},
|
||||
StatSConns: []string{},
|
||||
AttributeSConns: []string{},
|
||||
ResponderSConns: []string{},
|
||||
IndexedSelects: true,
|
||||
DefaultRatio: 1,
|
||||
}
|
||||
@@ -429,17 +430,17 @@ func testCGRConfigReloadERs(t *testing.T) {
|
||||
flags, _ := utils.FlagsWithParamsFromSlice([]string{"*dryrun"})
|
||||
flagsDefault, _ := utils.FlagsWithParamsFromSlice([]string{})
|
||||
content := []*FCTemplate{
|
||||
&FCTemplate{Tag: "ToR", Path: utils.ToR, Type: utils.MetaVariable, Value: NewRSRParsersMustCompile("~*req.2", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
&FCTemplate{Tag: utils.OriginID, Path: utils.OriginID, Type: utils.MetaVariable, Value: NewRSRParsersMustCompile("~*req.3", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
&FCTemplate{Tag: utils.RequestType, Path: utils.RequestType, Type: utils.MetaVariable, Value: NewRSRParsersMustCompile("~*req.4", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
&FCTemplate{Tag: utils.Tenant, Path: utils.Tenant, Type: utils.MetaVariable, Value: NewRSRParsersMustCompile("~*req.6", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
&FCTemplate{Tag: utils.Category, Path: utils.Category, Type: utils.MetaVariable, Value: NewRSRParsersMustCompile("~*req.7", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
&FCTemplate{Tag: utils.Account, Path: utils.Account, Type: utils.MetaVariable, Value: NewRSRParsersMustCompile("~*req.8", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
&FCTemplate{Tag: utils.Subject, Path: utils.Subject, Type: utils.MetaVariable, Value: NewRSRParsersMustCompile("~*req.9", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
&FCTemplate{Tag: utils.Destination, Path: utils.Destination, Type: utils.MetaVariable, Value: NewRSRParsersMustCompile("~*req.10", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
&FCTemplate{Tag: utils.SetupTime, Path: utils.SetupTime, Type: utils.MetaVariable, Value: NewRSRParsersMustCompile("~*req.11", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
&FCTemplate{Tag: utils.AnswerTime, Path: utils.AnswerTime, Type: utils.MetaVariable, Value: NewRSRParsersMustCompile("~*req.12", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
&FCTemplate{Tag: utils.Usage, Path: utils.Usage, Type: utils.MetaVariable, Value: NewRSRParsersMustCompile("~*req.13", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
&FCTemplate{Tag: utils.ToR, Path: utils.MetaCgreq + utils.NestingSep + utils.ToR, Type: utils.MetaVariable, Value: NewRSRParsersMustCompile("~*req.2", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
&FCTemplate{Tag: utils.OriginID, Path: utils.MetaCgreq + utils.NestingSep + utils.OriginID, Type: utils.MetaVariable, Value: NewRSRParsersMustCompile("~*req.3", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
&FCTemplate{Tag: utils.RequestType, Path: utils.MetaCgreq + utils.NestingSep + utils.RequestType, Type: utils.MetaVariable, Value: NewRSRParsersMustCompile("~*req.4", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
&FCTemplate{Tag: utils.Tenant, Path: utils.MetaCgreq + utils.NestingSep + utils.Tenant, Type: utils.MetaVariable, Value: NewRSRParsersMustCompile("~*req.6", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
&FCTemplate{Tag: utils.Category, Path: utils.MetaCgreq + utils.NestingSep + utils.Category, Type: utils.MetaVariable, Value: NewRSRParsersMustCompile("~*req.7", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
&FCTemplate{Tag: utils.Account, Path: utils.MetaCgreq + utils.NestingSep + utils.Account, Type: utils.MetaVariable, Value: NewRSRParsersMustCompile("~*req.8", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
&FCTemplate{Tag: utils.Subject, Path: utils.MetaCgreq + utils.NestingSep + utils.Subject, Type: utils.MetaVariable, Value: NewRSRParsersMustCompile("~*req.9", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
&FCTemplate{Tag: utils.Destination, Path: utils.MetaCgreq + utils.NestingSep + utils.Destination, Type: utils.MetaVariable, Value: NewRSRParsersMustCompile("~*req.10", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
&FCTemplate{Tag: utils.SetupTime, Path: utils.MetaCgreq + utils.NestingSep + utils.SetupTime, Type: utils.MetaVariable, Value: NewRSRParsersMustCompile("~*req.11", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
&FCTemplate{Tag: utils.AnswerTime, Path: utils.MetaCgreq + utils.NestingSep + utils.AnswerTime, Type: utils.MetaVariable, Value: NewRSRParsersMustCompile("~*req.12", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
&FCTemplate{Tag: utils.Usage, Path: utils.MetaCgreq + utils.NestingSep + utils.Usage, Type: utils.MetaVariable, Value: NewRSRParsersMustCompile("~*req.13", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
}
|
||||
expAttr := &ERsCfg{
|
||||
Enabled: true,
|
||||
@@ -557,7 +558,7 @@ func testCgrCfgV1ReloadConfigSection(t *testing.T) {
|
||||
"Blocker": false,
|
||||
"BreakOnSuccess": false,
|
||||
"CostShiftDigits": 0,
|
||||
"Path": "ToR",
|
||||
"Path": "*cgreq.ToR",
|
||||
"Filters": nil,
|
||||
"Layout": "",
|
||||
"Mandatory": true,
|
||||
@@ -582,7 +583,7 @@ func testCgrCfgV1ReloadConfigSection(t *testing.T) {
|
||||
"Blocker": false,
|
||||
"BreakOnSuccess": false,
|
||||
"CostShiftDigits": 0,
|
||||
"Path": "OriginID",
|
||||
"Path": "*cgreq.OriginID",
|
||||
"Filters": nil,
|
||||
"Layout": "",
|
||||
"Mandatory": true,
|
||||
@@ -607,7 +608,7 @@ func testCgrCfgV1ReloadConfigSection(t *testing.T) {
|
||||
"Blocker": false,
|
||||
"BreakOnSuccess": false,
|
||||
"CostShiftDigits": 0,
|
||||
"Path": "RequestType",
|
||||
"Path": "*cgreq.RequestType",
|
||||
"Filters": nil,
|
||||
"Layout": "",
|
||||
"Mandatory": true,
|
||||
@@ -632,7 +633,7 @@ func testCgrCfgV1ReloadConfigSection(t *testing.T) {
|
||||
"Blocker": false,
|
||||
"BreakOnSuccess": false,
|
||||
"CostShiftDigits": 0,
|
||||
"Path": "Tenant",
|
||||
"Path": "*cgreq.Tenant",
|
||||
"Filters": nil,
|
||||
"Layout": "",
|
||||
"Mandatory": true,
|
||||
@@ -657,7 +658,7 @@ func testCgrCfgV1ReloadConfigSection(t *testing.T) {
|
||||
"Blocker": false,
|
||||
"BreakOnSuccess": false,
|
||||
"CostShiftDigits": 0,
|
||||
"Path": "Category",
|
||||
"Path": "*cgreq.Category",
|
||||
"Filters": nil,
|
||||
"Layout": "",
|
||||
"Mandatory": true,
|
||||
@@ -682,7 +683,7 @@ func testCgrCfgV1ReloadConfigSection(t *testing.T) {
|
||||
"Blocker": false,
|
||||
"BreakOnSuccess": false,
|
||||
"CostShiftDigits": 0,
|
||||
"Path": "Account",
|
||||
"Path": "*cgreq.Account",
|
||||
"Filters": nil,
|
||||
"Layout": "",
|
||||
"Mandatory": true,
|
||||
@@ -707,7 +708,7 @@ func testCgrCfgV1ReloadConfigSection(t *testing.T) {
|
||||
"Blocker": false,
|
||||
"BreakOnSuccess": false,
|
||||
"CostShiftDigits": 0,
|
||||
"Path": "Subject",
|
||||
"Path": "*cgreq.Subject",
|
||||
"Filters": nil,
|
||||
"Layout": "",
|
||||
"Mandatory": true,
|
||||
@@ -732,7 +733,7 @@ func testCgrCfgV1ReloadConfigSection(t *testing.T) {
|
||||
"Blocker": false,
|
||||
"BreakOnSuccess": false,
|
||||
"CostShiftDigits": 0,
|
||||
"Path": "Destination",
|
||||
"Path": "*cgreq.Destination",
|
||||
"Filters": nil,
|
||||
"Layout": "",
|
||||
"Mandatory": true,
|
||||
@@ -757,7 +758,7 @@ func testCgrCfgV1ReloadConfigSection(t *testing.T) {
|
||||
"Blocker": false,
|
||||
"BreakOnSuccess": false,
|
||||
"CostShiftDigits": 0,
|
||||
"Path": "SetupTime",
|
||||
"Path": "*cgreq.SetupTime",
|
||||
"Filters": nil,
|
||||
"Layout": "",
|
||||
"Mandatory": true,
|
||||
@@ -782,7 +783,7 @@ func testCgrCfgV1ReloadConfigSection(t *testing.T) {
|
||||
"Blocker": false,
|
||||
"BreakOnSuccess": false,
|
||||
"CostShiftDigits": 0,
|
||||
"Path": "AnswerTime",
|
||||
"Path": "*cgreq.AnswerTime",
|
||||
"Filters": nil,
|
||||
"Layout": "",
|
||||
"Mandatory": true,
|
||||
@@ -807,7 +808,7 @@ func testCgrCfgV1ReloadConfigSection(t *testing.T) {
|
||||
"Blocker": false,
|
||||
"BreakOnSuccess": false,
|
||||
"CostShiftDigits": 0,
|
||||
"Path": "Usage",
|
||||
"Path": "*cgreq.Usage",
|
||||
"Filters": nil,
|
||||
"Layout": "",
|
||||
"Mandatory": true,
|
||||
|
||||
@@ -1644,27 +1644,27 @@ func TestDfApierCfg(t *testing.T) {
|
||||
|
||||
func TestDfEventReaderCfg(t *testing.T) {
|
||||
cdrFields := []*FcTemplateJsonCfg{
|
||||
{Tag: utils.StringPointer("ToR"), Path: utils.StringPointer(utils.ToR), Type: utils.StringPointer(utils.MetaVariable),
|
||||
{Tag: utils.StringPointer(utils.ToR), Path: utils.StringPointer(utils.MetaCgreq + utils.NestingSep + utils.ToR), Type: utils.StringPointer(utils.MetaVariable),
|
||||
Value: utils.StringPointer("~*req.2"), Mandatory: utils.BoolPointer(true)},
|
||||
{Tag: utils.StringPointer("OriginID"), Path: utils.StringPointer(utils.OriginID), Type: utils.StringPointer(utils.MetaVariable),
|
||||
{Tag: utils.StringPointer(utils.OriginID), Path: utils.StringPointer(utils.MetaCgreq + utils.NestingSep + utils.OriginID), Type: utils.StringPointer(utils.MetaVariable),
|
||||
Value: utils.StringPointer("~*req.3"), Mandatory: utils.BoolPointer(true)},
|
||||
{Tag: utils.StringPointer("RequestType"), Path: utils.StringPointer(utils.RequestType), Type: utils.StringPointer(utils.MetaVariable),
|
||||
{Tag: utils.StringPointer(utils.RequestType), Path: utils.StringPointer(utils.MetaCgreq + utils.NestingSep + utils.RequestType), Type: utils.StringPointer(utils.MetaVariable),
|
||||
Value: utils.StringPointer("~*req.4"), Mandatory: utils.BoolPointer(true)},
|
||||
{Tag: utils.StringPointer("Tenant"), Path: utils.StringPointer(utils.Tenant), Type: utils.StringPointer(utils.MetaVariable),
|
||||
{Tag: utils.StringPointer(utils.Tenant), Path: utils.StringPointer(utils.MetaCgreq + utils.NestingSep + utils.Tenant), Type: utils.StringPointer(utils.MetaVariable),
|
||||
Value: utils.StringPointer("~*req.6"), Mandatory: utils.BoolPointer(true)},
|
||||
{Tag: utils.StringPointer("Category"), Path: utils.StringPointer(utils.Category), Type: utils.StringPointer(utils.MetaVariable),
|
||||
{Tag: utils.StringPointer(utils.Category), Path: utils.StringPointer(utils.MetaCgreq + utils.NestingSep + utils.Category), Type: utils.StringPointer(utils.MetaVariable),
|
||||
Value: utils.StringPointer("~*req.7"), Mandatory: utils.BoolPointer(true)},
|
||||
{Tag: utils.StringPointer("Account"), Path: utils.StringPointer(utils.Account), Type: utils.StringPointer(utils.MetaVariable),
|
||||
{Tag: utils.StringPointer(utils.Account), Path: utils.StringPointer(utils.MetaCgreq + utils.NestingSep + utils.Account), Type: utils.StringPointer(utils.MetaVariable),
|
||||
Value: utils.StringPointer("~*req.8"), Mandatory: utils.BoolPointer(true)},
|
||||
{Tag: utils.StringPointer("Subject"), Path: utils.StringPointer(utils.Subject), Type: utils.StringPointer(utils.MetaVariable),
|
||||
{Tag: utils.StringPointer(utils.Subject), Path: utils.StringPointer(utils.MetaCgreq + utils.NestingSep + utils.Subject), Type: utils.StringPointer(utils.MetaVariable),
|
||||
Value: utils.StringPointer("~*req.9"), Mandatory: utils.BoolPointer(true)},
|
||||
{Tag: utils.StringPointer("Destination"), Path: utils.StringPointer(utils.Destination), Type: utils.StringPointer(utils.MetaVariable),
|
||||
{Tag: utils.StringPointer(utils.Destination), Path: utils.StringPointer(utils.MetaCgreq + utils.NestingSep + utils.Destination), Type: utils.StringPointer(utils.MetaVariable),
|
||||
Value: utils.StringPointer("~*req.10"), Mandatory: utils.BoolPointer(true)},
|
||||
{Tag: utils.StringPointer("SetupTime"), Path: utils.StringPointer(utils.SetupTime), Type: utils.StringPointer(utils.MetaVariable),
|
||||
{Tag: utils.StringPointer(utils.SetupTime), Path: utils.StringPointer(utils.MetaCgreq + utils.NestingSep + utils.SetupTime), Type: utils.StringPointer(utils.MetaVariable),
|
||||
Value: utils.StringPointer("~*req.11"), Mandatory: utils.BoolPointer(true)},
|
||||
{Tag: utils.StringPointer("AnswerTime"), Path: utils.StringPointer(utils.AnswerTime), Type: utils.StringPointer(utils.MetaVariable),
|
||||
{Tag: utils.StringPointer(utils.AnswerTime), Path: utils.StringPointer(utils.MetaCgreq + utils.NestingSep + utils.AnswerTime), Type: utils.StringPointer(utils.MetaVariable),
|
||||
Value: utils.StringPointer("~*req.12"), Mandatory: utils.BoolPointer(true)},
|
||||
{Tag: utils.StringPointer("Usage"), Path: utils.StringPointer(utils.Usage), Type: utils.StringPointer(utils.MetaVariable),
|
||||
{Tag: utils.StringPointer(utils.Usage), Path: utils.StringPointer(utils.MetaCgreq + utils.NestingSep + utils.Usage), Type: utils.StringPointer(utils.MetaVariable),
|
||||
Value: utils.StringPointer("~*req.13"), Mandatory: utils.BoolPointer(true)},
|
||||
}
|
||||
eCfg := &ERsJsonCfg{
|
||||
|
||||
@@ -1683,27 +1683,27 @@ func TestCgrCdfEventReader(t *testing.T) {
|
||||
Filters: []string{},
|
||||
Flags: utils.FlagsWithParams{},
|
||||
Fields: []*FCTemplate{
|
||||
{Tag: "ToR", Path: "ToR", Type: utils.MetaVariable,
|
||||
{Tag: utils.ToR, Path: utils.MetaCgreq + utils.NestingSep + utils.ToR, Type: utils.MetaVariable,
|
||||
Value: NewRSRParsersMustCompile("~*req.2", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
{Tag: "OriginID", Path: "OriginID", Type: utils.MetaVariable,
|
||||
{Tag: utils.OriginID, Path: utils.MetaCgreq + utils.NestingSep + utils.OriginID, Type: utils.MetaVariable,
|
||||
Value: NewRSRParsersMustCompile("~*req.3", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
{Tag: "RequestType", Path: "RequestType", Type: utils.MetaVariable,
|
||||
{Tag: utils.RequestType, Path: utils.MetaCgreq + utils.NestingSep + utils.RequestType, Type: utils.MetaVariable,
|
||||
Value: NewRSRParsersMustCompile("~*req.4", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
{Tag: "Tenant", Path: "Tenant", Type: utils.MetaVariable,
|
||||
{Tag: utils.Tenant, Path: utils.MetaCgreq + utils.NestingSep + utils.Tenant, Type: utils.MetaVariable,
|
||||
Value: NewRSRParsersMustCompile("~*req.6", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
{Tag: "Category", Path: "Category", Type: utils.MetaVariable,
|
||||
{Tag: utils.Category, Path: utils.MetaCgreq + utils.NestingSep + utils.Category, Type: utils.MetaVariable,
|
||||
Value: NewRSRParsersMustCompile("~*req.7", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
{Tag: "Account", Path: "Account", Type: utils.MetaVariable,
|
||||
{Tag: utils.Account, Path: utils.MetaCgreq + utils.NestingSep + utils.Account, Type: utils.MetaVariable,
|
||||
Value: NewRSRParsersMustCompile("~*req.8", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
{Tag: "Subject", Path: "Subject", Type: utils.MetaVariable,
|
||||
{Tag: utils.Subject, Path: utils.MetaCgreq + utils.NestingSep + utils.Subject, Type: utils.MetaVariable,
|
||||
Value: NewRSRParsersMustCompile("~*req.9", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
{Tag: "Destination", Path: "Destination", Type: utils.MetaVariable,
|
||||
{Tag: utils.Destination, Path: utils.MetaCgreq + utils.NestingSep + utils.Destination, Type: utils.MetaVariable,
|
||||
Value: NewRSRParsersMustCompile("~*req.10", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
{Tag: "SetupTime", Path: "SetupTime", Type: utils.MetaVariable,
|
||||
{Tag: utils.SetupTime, Path: utils.MetaCgreq + utils.NestingSep + utils.SetupTime, Type: utils.MetaVariable,
|
||||
Value: NewRSRParsersMustCompile("~*req.11", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
{Tag: "AnswerTime", Path: "AnswerTime", Type: utils.MetaVariable,
|
||||
{Tag: utils.AnswerTime, Path: utils.MetaCgreq + utils.NestingSep + utils.AnswerTime, Type: utils.MetaVariable,
|
||||
Value: NewRSRParsersMustCompile("~*req.12", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
{Tag: "Usage", Path: "Usage", Type: utils.MetaVariable,
|
||||
{Tag: utils.Usage, Path: utils.MetaCgreq + utils.NestingSep + utils.Usage, Type: utils.MetaVariable,
|
||||
Value: NewRSRParsersMustCompile("~*req.13", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
},
|
||||
CacheDumpFields: []*FCTemplate{},
|
||||
@@ -1730,27 +1730,27 @@ func TestCgrCfgEventReaderDefault(t *testing.T) {
|
||||
Filters: nil,
|
||||
Flags: utils.FlagsWithParams{},
|
||||
Fields: []*FCTemplate{
|
||||
{Tag: "ToR", Path: "ToR", Type: utils.MetaVariable,
|
||||
{Tag: utils.ToR, Path: utils.MetaCgreq + utils.NestingSep + utils.ToR, Type: utils.MetaVariable,
|
||||
Value: NewRSRParsersMustCompile("~*req.2", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
{Tag: "OriginID", Path: "OriginID", Type: utils.MetaVariable,
|
||||
{Tag: utils.OriginID, Path: utils.MetaCgreq + utils.NestingSep + utils.OriginID, Type: utils.MetaVariable,
|
||||
Value: NewRSRParsersMustCompile("~*req.3", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
{Tag: "RequestType", Path: "RequestType", Type: utils.MetaVariable,
|
||||
{Tag: utils.RequestType, Path: utils.MetaCgreq + utils.NestingSep + utils.RequestType, Type: utils.MetaVariable,
|
||||
Value: NewRSRParsersMustCompile("~*req.4", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
{Tag: "Tenant", Path: "Tenant", Type: utils.MetaVariable,
|
||||
{Tag: utils.Tenant, Path: utils.MetaCgreq + utils.NestingSep + utils.Tenant, Type: utils.MetaVariable,
|
||||
Value: NewRSRParsersMustCompile("~*req.6", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
{Tag: "Category", Path: "Category", Type: utils.MetaVariable,
|
||||
{Tag: utils.Category, Path: utils.MetaCgreq + utils.NestingSep + utils.Category, Type: utils.MetaVariable,
|
||||
Value: NewRSRParsersMustCompile("~*req.7", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
{Tag: "Account", Path: "Account", Type: utils.MetaVariable,
|
||||
{Tag: utils.Account, Path: utils.MetaCgreq + utils.NestingSep + utils.Account, Type: utils.MetaVariable,
|
||||
Value: NewRSRParsersMustCompile("~*req.8", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
{Tag: "Subject", Path: "Subject", Type: utils.MetaVariable,
|
||||
{Tag: utils.Subject, Path: utils.MetaCgreq + utils.NestingSep + utils.Subject, Type: utils.MetaVariable,
|
||||
Value: NewRSRParsersMustCompile("~*req.9", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
{Tag: "Destination", Path: "Destination", Type: utils.MetaVariable,
|
||||
{Tag: utils.Destination, Path: utils.MetaCgreq + utils.NestingSep + utils.Destination, Type: utils.MetaVariable,
|
||||
Value: NewRSRParsersMustCompile("~*req.10", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
{Tag: "SetupTime", Path: "SetupTime", Type: utils.MetaVariable,
|
||||
{Tag: utils.SetupTime, Path: utils.MetaCgreq + utils.NestingSep + utils.SetupTime, Type: utils.MetaVariable,
|
||||
Value: NewRSRParsersMustCompile("~*req.11", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
{Tag: "AnswerTime", Path: "AnswerTime", Type: utils.MetaVariable,
|
||||
{Tag: utils.AnswerTime, Path: utils.MetaCgreq + utils.NestingSep + utils.AnswerTime, Type: utils.MetaVariable,
|
||||
Value: NewRSRParsersMustCompile("~*req.12", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
{Tag: "Usage", Path: "Usage", Type: utils.MetaVariable,
|
||||
{Tag: utils.Usage, Path: utils.MetaCgreq + utils.NestingSep + utils.Usage, Type: utils.MetaVariable,
|
||||
Value: NewRSRParsersMustCompile("~*req.13", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
},
|
||||
CacheDumpFields: make([]*FCTemplate, 0),
|
||||
|
||||
@@ -112,27 +112,27 @@ func TestEventReaderLoadFromJSON(t *testing.T) {
|
||||
Filters: []string{},
|
||||
Flags: utils.FlagsWithParams{},
|
||||
Fields: []*FCTemplate{
|
||||
{Tag: "ToR", Path: "ToR", Type: utils.MetaVariable,
|
||||
{Tag: utils.ToR, Path: utils.MetaCgreq + utils.NestingSep + utils.ToR, Type: utils.MetaVariable,
|
||||
Value: NewRSRParsersMustCompile("~*req.2", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
{Tag: "OriginID", Path: "OriginID", Type: utils.MetaVariable,
|
||||
{Tag: utils.OriginID, Path: utils.MetaCgreq + utils.NestingSep + utils.OriginID, Type: utils.MetaVariable,
|
||||
Value: NewRSRParsersMustCompile("~*req.3", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
{Tag: "RequestType", Path: "RequestType", Type: utils.MetaVariable,
|
||||
{Tag: utils.RequestType, Path: utils.MetaCgreq + utils.NestingSep + utils.RequestType, Type: utils.MetaVariable,
|
||||
Value: NewRSRParsersMustCompile("~*req.4", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
{Tag: "Tenant", Path: "Tenant", Type: utils.MetaVariable,
|
||||
{Tag: utils.Tenant, Path: utils.MetaCgreq + utils.NestingSep + utils.Tenant, Type: utils.MetaVariable,
|
||||
Value: NewRSRParsersMustCompile("~*req.6", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
{Tag: "Category", Path: "Category", Type: utils.MetaVariable,
|
||||
{Tag: utils.Category, Path: utils.MetaCgreq + utils.NestingSep + utils.Category, Type: utils.MetaVariable,
|
||||
Value: NewRSRParsersMustCompile("~*req.7", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
{Tag: "Account", Path: "Account", Type: utils.MetaVariable,
|
||||
{Tag: utils.Account, Path: utils.MetaCgreq + utils.NestingSep + utils.Account, Type: utils.MetaVariable,
|
||||
Value: NewRSRParsersMustCompile("~*req.8", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
{Tag: "Subject", Path: "Subject", Type: utils.MetaVariable,
|
||||
{Tag: utils.Subject, Path: utils.MetaCgreq + utils.NestingSep + utils.Subject, Type: utils.MetaVariable,
|
||||
Value: NewRSRParsersMustCompile("~*req.9", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
{Tag: "Destination", Path: "Destination", Type: utils.MetaVariable,
|
||||
{Tag: utils.Destination, Path: utils.MetaCgreq + utils.NestingSep + utils.Destination, Type: utils.MetaVariable,
|
||||
Value: NewRSRParsersMustCompile("~*req.10", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
{Tag: "SetupTime", Path: "SetupTime", Type: utils.MetaVariable,
|
||||
{Tag: utils.SetupTime, Path: utils.MetaCgreq + utils.NestingSep + utils.SetupTime, Type: utils.MetaVariable,
|
||||
Value: NewRSRParsersMustCompile("~*req.11", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
{Tag: "AnswerTime", Path: "AnswerTime", Type: utils.MetaVariable,
|
||||
{Tag: utils.AnswerTime, Path: utils.MetaCgreq + utils.NestingSep + utils.AnswerTime, Type: utils.MetaVariable,
|
||||
Value: NewRSRParsersMustCompile("~*req.12", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
{Tag: "Usage", Path: "Usage", Type: utils.MetaVariable,
|
||||
{Tag: utils.Usage, Path: utils.MetaCgreq + utils.NestingSep + utils.Usage, Type: utils.MetaVariable,
|
||||
Value: NewRSRParsersMustCompile("~*req.13", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
},
|
||||
CacheDumpFields: make([]*FCTemplate, 0),
|
||||
@@ -151,27 +151,27 @@ func TestEventReaderLoadFromJSON(t *testing.T) {
|
||||
Filters: nil,
|
||||
Flags: utils.FlagsWithParams{},
|
||||
Fields: []*FCTemplate{
|
||||
{Tag: "ToR", Path: "ToR", Type: utils.MetaVariable,
|
||||
{Tag: utils.ToR, Path: utils.MetaCgreq + utils.NestingSep + utils.ToR, Type: utils.MetaVariable,
|
||||
Value: NewRSRParsersMustCompile("~*req.2", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
{Tag: "OriginID", Path: "OriginID", Type: utils.MetaVariable,
|
||||
{Tag: utils.OriginID, Path: utils.MetaCgreq + utils.NestingSep + utils.OriginID, Type: utils.MetaVariable,
|
||||
Value: NewRSRParsersMustCompile("~*req.3", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
{Tag: "RequestType", Path: "RequestType", Type: utils.MetaVariable,
|
||||
{Tag: utils.RequestType, Path: utils.MetaCgreq + utils.NestingSep + utils.RequestType, Type: utils.MetaVariable,
|
||||
Value: NewRSRParsersMustCompile("~*req.4", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
{Tag: "Tenant", Path: "Tenant", Type: utils.MetaVariable,
|
||||
{Tag: utils.Tenant, Path: utils.MetaCgreq + utils.NestingSep + utils.Tenant, Type: utils.MetaVariable,
|
||||
Value: NewRSRParsersMustCompile("~*req.6", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
{Tag: "Category", Path: "Category", Type: utils.MetaVariable,
|
||||
{Tag: utils.Category, Path: utils.MetaCgreq + utils.NestingSep + utils.Category, Type: utils.MetaVariable,
|
||||
Value: NewRSRParsersMustCompile("~*req.7", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
{Tag: "Account", Path: "Account", Type: utils.MetaVariable,
|
||||
{Tag: utils.Account, Path: utils.MetaCgreq + utils.NestingSep + utils.Account, Type: utils.MetaVariable,
|
||||
Value: NewRSRParsersMustCompile("~*req.8", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
{Tag: "Subject", Path: "Subject", Type: utils.MetaVariable,
|
||||
{Tag: utils.Subject, Path: utils.MetaCgreq + utils.NestingSep + utils.Subject, Type: utils.MetaVariable,
|
||||
Value: NewRSRParsersMustCompile("~*req.9", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
{Tag: "Destination", Path: "Destination", Type: utils.MetaVariable,
|
||||
{Tag: utils.Destination, Path: utils.MetaCgreq + utils.NestingSep + utils.Destination, Type: utils.MetaVariable,
|
||||
Value: NewRSRParsersMustCompile("~*req.10", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
{Tag: "SetupTime", Path: "SetupTime", Type: utils.MetaVariable,
|
||||
{Tag: utils.SetupTime, Path: utils.MetaCgreq + utils.NestingSep + utils.SetupTime, Type: utils.MetaVariable,
|
||||
Value: NewRSRParsersMustCompile("~*req.11", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
{Tag: "AnswerTime", Path: "AnswerTime", Type: utils.MetaVariable,
|
||||
{Tag: utils.AnswerTime, Path: utils.MetaCgreq + utils.NestingSep + utils.AnswerTime, Type: utils.MetaVariable,
|
||||
Value: NewRSRParsersMustCompile("~*req.12", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
{Tag: "Usage", Path: "Usage", Type: utils.MetaVariable,
|
||||
{Tag: utils.Usage, Path: utils.MetaCgreq + utils.NestingSep + utils.Usage, Type: utils.MetaVariable,
|
||||
Value: NewRSRParsersMustCompile("~*req.13", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
},
|
||||
CacheDumpFields: make([]*FCTemplate, 0),
|
||||
@@ -244,27 +244,27 @@ func TestEventReaderSameID(t *testing.T) {
|
||||
Filters: []string{},
|
||||
Flags: utils.FlagsWithParams{},
|
||||
Fields: []*FCTemplate{
|
||||
{Tag: "ToR", Path: "ToR", Type: utils.MetaVariable,
|
||||
{Tag: utils.ToR, Path: utils.MetaCgreq + utils.NestingSep + utils.ToR, Type: utils.MetaVariable,
|
||||
Value: NewRSRParsersMustCompile("~*req.2", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
{Tag: "OriginID", Path: "OriginID", Type: utils.MetaVariable,
|
||||
{Tag: utils.OriginID, Path: utils.MetaCgreq + utils.NestingSep + utils.OriginID, Type: utils.MetaVariable,
|
||||
Value: NewRSRParsersMustCompile("~*req.3", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
{Tag: "RequestType", Path: "RequestType", Type: utils.MetaVariable,
|
||||
{Tag: utils.RequestType, Path: utils.MetaCgreq + utils.NestingSep + utils.RequestType, Type: utils.MetaVariable,
|
||||
Value: NewRSRParsersMustCompile("~*req.4", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
{Tag: "Tenant", Path: "Tenant", Type: utils.MetaVariable,
|
||||
{Tag: utils.Tenant, Path: utils.MetaCgreq + utils.NestingSep + utils.Tenant, Type: utils.MetaVariable,
|
||||
Value: NewRSRParsersMustCompile("~*req.6", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
{Tag: "Category", Path: "Category", Type: utils.MetaVariable,
|
||||
{Tag: utils.Category, Path: utils.MetaCgreq + utils.NestingSep + utils.Category, Type: utils.MetaVariable,
|
||||
Value: NewRSRParsersMustCompile("~*req.7", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
{Tag: "Account", Path: "Account", Type: utils.MetaVariable,
|
||||
{Tag: utils.Account, Path: utils.MetaCgreq + utils.NestingSep + utils.Account, Type: utils.MetaVariable,
|
||||
Value: NewRSRParsersMustCompile("~*req.8", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
{Tag: "Subject", Path: "Subject", Type: utils.MetaVariable,
|
||||
{Tag: utils.Subject, Path: utils.MetaCgreq + utils.NestingSep + utils.Subject, Type: utils.MetaVariable,
|
||||
Value: NewRSRParsersMustCompile("~*req.9", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
{Tag: "Destination", Path: "Destination", Type: utils.MetaVariable,
|
||||
{Tag: utils.Destination, Path: utils.MetaCgreq + utils.NestingSep + utils.Destination, Type: utils.MetaVariable,
|
||||
Value: NewRSRParsersMustCompile("~*req.10", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
{Tag: "SetupTime", Path: "SetupTime", Type: utils.MetaVariable,
|
||||
{Tag: utils.SetupTime, Path: utils.MetaCgreq + utils.NestingSep + utils.SetupTime, Type: utils.MetaVariable,
|
||||
Value: NewRSRParsersMustCompile("~*req.11", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
{Tag: "AnswerTime", Path: "AnswerTime", Type: utils.MetaVariable,
|
||||
{Tag: utils.AnswerTime, Path: utils.MetaCgreq + utils.NestingSep + utils.AnswerTime, Type: utils.MetaVariable,
|
||||
Value: NewRSRParsersMustCompile("~*req.12", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
{Tag: "Usage", Path: "Usage", Type: utils.MetaVariable,
|
||||
{Tag: utils.Usage, Path: utils.MetaCgreq + utils.NestingSep + utils.Usage, Type: utils.MetaVariable,
|
||||
Value: NewRSRParsersMustCompile("~*req.13", true, utils.INFIELD_SEP), Mandatory: true},
|
||||
},
|
||||
CacheDumpFields: make([]*FCTemplate, 0),
|
||||
|
||||
@@ -297,17 +297,17 @@
|
||||
// "filters": [], // limit parsing based on the filters
|
||||
// "flags": [], // flags to influence the event processing
|
||||
// "fields":[ // import fields template, tag will match internally CDR field, in case of .csv value will be represented by index of the field value
|
||||
// {"tag": "ToR", "path": "ToR", "type": "*variable", "value": "~*req.2", "mandatory": true},
|
||||
// {"tag": "OriginID", "path": "OriginID", "type": "*variable", "value": "~*req.3", "mandatory": true},
|
||||
// {"tag": "RequestType", "path": "RequestType", "type": "*variable", "value": "~*req.4", "mandatory": true},
|
||||
// {"tag": "Tenant", "path": "Tenant", "type": "*variable", "value": "~*req.6", "mandatory": true},
|
||||
// {"tag": "Category", "path": "Category", "type": "*variable", "value": "~*req.7", "mandatory": true},
|
||||
// {"tag": "Account", "path": "Account", "type": "*variable", "value": "~*req.8", "mandatory": true},
|
||||
// {"tag": "Subject", "path": "Subject", "type": "*variable", "value": "~*req.9", "mandatory": true},
|
||||
// {"tag": "Destination", "path": "Destination", "type": "*variable", "value": "~*req.10", "mandatory": true},
|
||||
// {"tag": "SetupTime", "path": "SetupTime", "type": "*variable", "value": "~*req.11", "mandatory": true},
|
||||
// {"tag": "AnswerTime", "path": "AnswerTime", "type": "*variable", "value": "~*req.12", "mandatory": true},
|
||||
// {"tag": "Usage", "path": "Usage", "type": "*variable", "value": "~*req.13", "mandatory": true},
|
||||
// {"tag": "ToR", "path": "*cgreq.ToR", "type": "*variable", "value": "~*req.2", "mandatory": true},
|
||||
// {"tag": "OriginID", "path": "*cgreq.OriginID", "type": "*variable", "value": "~*req.3", "mandatory": true},
|
||||
// {"tag": "RequestType", "path": "*cgreq.RequestType", "type": "*variable", "value": "~*req.4", "mandatory": true},
|
||||
// {"tag": "Tenant", "path": "*cgreq.Tenant", "type": "*variable", "value": "~*req.6", "mandatory": true},
|
||||
// {"tag": "Category", "path": "*cgreq.Category", "type": "*variable", "value": "~*req.7", "mandatory": true},
|
||||
// {"tag": "Account", "path": "*cgreq.Account", "type": "*variable", "value": "~*req.8", "mandatory": true},
|
||||
// {"tag": "Subject", "path": "*cgreq.Subject", "type": "*variable", "value": "~*req.9", "mandatory": true},
|
||||
// {"tag": "Destination", "path": "*cgreq.Destination", "type": "*variable", "value": "~*req.10", "mandatory": true},
|
||||
// {"tag": "SetupTime", "path": "*cgreq.SetupTime", "type": "*variable", "value": "~*req.11", "mandatory": true},
|
||||
// {"tag": "AnswerTime", "path": "*cgreq.AnswerTime", "type": "*variable", "value": "~*req.12", "mandatory": true},
|
||||
// {"tag": "Usage", "path": "*cgreq.Usage", "type": "*variable", "value": "~*req.13", "mandatory": true},
|
||||
// ],
|
||||
// "cache_dump_fields": [],
|
||||
// },
|
||||
@@ -537,6 +537,7 @@
|
||||
// "attributes_conns": [], // connections to AttributeS for altering events before supplier queries: <""|*internal|127.0.0.1:2013>
|
||||
// "resources_conns": [], // connections to ResourceS for *res sorting, empty to disable functionality: <""|*internal|x.y.z.y:1234>
|
||||
// "stats_conns": [], // connections to StatS for *stats sorting, empty to disable stats functionality: <""|*internal|x.y.z.y:1234>
|
||||
// "rals_conns": [], // connections to Rater for calculating cost, empty to disable stats functionality: <""|*internal|x.y.z.y:1234>
|
||||
// "default_ratio":1 // default ratio used in case of *load strategy
|
||||
// },
|
||||
|
||||
|
||||
@@ -76,17 +76,17 @@
|
||||
"source_path": "/tmp/ers/in",
|
||||
"processed_path": "/tmp/ers/out",
|
||||
"fields":[ // import content_fields template, tag will match internally CDR field, in case of .csv value will be represented by index of the field value
|
||||
{"tag": "ToR", "path": "ToR", "type": "*variable", "value": "~*req.2", "mandatory": true},
|
||||
{"tag": "OriginID", "path": "OriginID", "type": "*variable", "value": "~*req.3", "mandatory": true},
|
||||
{"tag": "RequestType", "path": "RequestType", "type": "*variable", "value": "~*req.4", "mandatory": true},
|
||||
{"tag": "Tenant", "path": "Tenant", "type": "*variable", "value": "~*req.6", "mandatory": true},
|
||||
{"tag": "Category", "path": "Category", "type": "*variable", "value": "~*req.7", "mandatory": true},
|
||||
{"tag": "Account", "path": "Account", "type": "*variable", "value": "~*req.8", "mandatory": true},
|
||||
{"tag": "Subject", "path": "Subject", "type": "*variable", "value": "~*req.9", "mandatory": true},
|
||||
{"tag": "Destination", "path": "Destination", "type": "*variable", "value": "~*req.10", "mandatory": true},
|
||||
{"tag": "SetupTime", "path": "SetupTime", "type": "*variable", "value": "~*req.11", "mandatory": true},
|
||||
{"tag": "AnswerTime", "path": "AnswerTime", "type": "*variable", "value": "~*req.12", "mandatory": true},
|
||||
{"tag": "Usage", "path": "Usage", "type": "*variable", "value": "~*req.13", "mandatory": true},
|
||||
{"tag": "ToR", "path": "*cgreq.ToR", "type": "*variable", "value": "~*req.2", "mandatory": true},
|
||||
{"tag": "OriginID", "path": "*cgreq.OriginID", "type": "*variable", "value": "~*req.3", "mandatory": true},
|
||||
{"tag": "RequestType", "path": "*cgreq.RequestType", "type": "*variable", "value": "~*req.4", "mandatory": true},
|
||||
{"tag": "Tenant", "path": "*cgreq.Tenant", "type": "*variable", "value": "~*req.6", "mandatory": true},
|
||||
{"tag": "Category", "path": "*cgreq.Category", "type": "*variable", "value": "~*req.7", "mandatory": true},
|
||||
{"tag": "Account", "path": "*cgreq.Account", "type": "*variable", "value": "~*req.8", "mandatory": true},
|
||||
{"tag": "Subject", "path": "*cgreq.Subject", "type": "*variable", "value": "~*req.9", "mandatory": true},
|
||||
{"tag": "Destination", "path": "*cgreq.Destination", "type": "*variable", "value": "~*req.10", "mandatory": true},
|
||||
{"tag": "SetupTime", "path": "*cgreq.SetupTime", "type": "*variable", "value": "~*req.11", "mandatory": true},
|
||||
{"tag": "AnswerTime", "path": "*cgreq.AnswerTime", "type": "*variable", "value": "~*req.12", "mandatory": true},
|
||||
{"tag": "Usage", "path": "*cgreq.Usage", "type": "*variable", "value": "~*req.13", "mandatory": true},
|
||||
],
|
||||
},
|
||||
],
|
||||
|
||||
Reference in New Issue
Block a user