diff --git a/config/cdrcconfig.go b/config/cdrcconfig.go index 9d0c70ebe..e6cfbff30 100644 --- a/config/cdrcconfig.go +++ b/config/cdrcconfig.go @@ -46,6 +46,7 @@ type CdrcConfig struct { HeaderFields []*CfgCdrField ContentFields []*CfgCdrField TrailerFields []*CfgCdrField + CacheDumpFields []*CfgCdrField } func (self *CdrcConfig) loadFromJsonCfg(jsnCfg *CdrcJsonCfg) error { @@ -131,6 +132,11 @@ func (self *CdrcConfig) loadFromJsonCfg(jsnCfg *CdrcJsonCfg) error { return err } } + if jsnCfg.Cache_dump_fields != nil { + if self.CacheDumpFields, err = CfgCdrFieldsFromCdrFieldsJsonCfg(*jsnCfg.Cache_dump_fields); err != nil { + return err + } + } return nil } @@ -156,6 +162,7 @@ func (self *CdrcConfig) Clone() *CdrcConfig { clnCdrc.HeaderFields = make([]*CfgCdrField, len(self.HeaderFields)) clnCdrc.ContentFields = make([]*CfgCdrField, len(self.ContentFields)) clnCdrc.TrailerFields = make([]*CfgCdrField, len(self.TrailerFields)) + clnCdrc.CacheDumpFields = make([]*CfgCdrField, len(self.CacheDumpFields)) for idx, fld := range self.HeaderFields { clonedVal := *fld clnCdrc.HeaderFields[idx] = &clonedVal @@ -168,5 +175,9 @@ func (self *CdrcConfig) Clone() *CdrcConfig { clonedVal := *fld clnCdrc.TrailerFields[idx] = &clonedVal } + for idx, fld := range self.CacheDumpFields { + clonedVal := *fld + clnCdrc.CacheDumpFields[idx] = &clonedVal + } return clnCdrc } diff --git a/config/config_defaults.go b/config/config_defaults.go index 43f9fd05a..118974b12 100644 --- a/config/config_defaults.go +++ b/config/config_defaults.go @@ -172,6 +172,23 @@ const CGRATES_CFG_JSON = ` {"tag": "Usage", "field_id": "Usage", "type": "*composed", "value": "13", "mandatory": true}, ], "trailer_fields": [], // template of the import trailer fields + "cache_dump_fields": [ + {"tag": "CGRID", "type": "*composed", "value": "CGRID"}, + {"tag": "RunID", "type": "*composed", "value": "RunID"}, + {"tag": "TOR", "type": "*composed", "value": "ToR"}, + {"tag": "OriginID", "type": "*composed", "value": "OriginID"}, + {"tag": "RequestType", "type": "*composed", "value": "RequestType"}, + {"tag": "Direction", "type": "*composed", "value": "Direction"}, + {"tag": "Tenant", "type": "*composed", "value": "Tenant"}, + {"tag": "Category", "type": "*composed", "value": "Category"}, + {"tag": "Account", "type": "*composed", "value": "Account"}, + {"tag": "Subject", "type": "*composed", "value": "Subject"}, + {"tag": "Destination", "type": "*composed", "value": "Destination"}, + {"tag": "SetupTime", "type": "*composed", "value": "SetupTime", "layout": "2006-01-02T15:04:05Z07:00"}, + {"tag": "AnswerTime", "type": "*composed", "value": "AnswerTime", "layout": "2006-01-02T15:04:05Z07:00"}, + {"tag": "Usage", "type": "*composed", "value": "Usage"}, + {"tag": "Cost", "type": "*composed", "value": "Cost"}, + ], }, ], diff --git a/config/config_json_test.go b/config/config_json_test.go index 70d5225c7..baea5acfb 100644 --- a/config/config_json_test.go +++ b/config/config_json_test.go @@ -292,6 +292,55 @@ func TestDfCdrcJsonCfg(t *testing.T) { &CdrFieldJsonCfg{Tag: utils.StringPointer("Usage"), Field_id: utils.StringPointer(utils.USAGE), Type: utils.StringPointer(utils.META_COMPOSED), Value: utils.StringPointer("13"), Mandatory: utils.BoolPointer(true)}, } + cacheDumpFields := []*CdrFieldJsonCfg{ + &CdrFieldJsonCfg{Tag: utils.StringPointer("CGRID"), + Type: utils.StringPointer(utils.META_COMPOSED), + Value: utils.StringPointer(utils.CGRID)}, + &CdrFieldJsonCfg{Tag: utils.StringPointer("RunID"), + Type: utils.StringPointer(utils.META_COMPOSED), + Value: utils.StringPointer(utils.MEDI_RUNID)}, + &CdrFieldJsonCfg{Tag: utils.StringPointer("TOR"), + Type: utils.StringPointer(utils.META_COMPOSED), + Value: utils.StringPointer(utils.TOR)}, + &CdrFieldJsonCfg{Tag: utils.StringPointer("OriginID"), + Type: utils.StringPointer(utils.META_COMPOSED), + Value: utils.StringPointer(utils.ACCID)}, + &CdrFieldJsonCfg{Tag: utils.StringPointer("RequestType"), + Type: utils.StringPointer(utils.META_COMPOSED), + Value: utils.StringPointer(utils.REQTYPE)}, + &CdrFieldJsonCfg{Tag: utils.StringPointer("Direction"), + Type: utils.StringPointer(utils.META_COMPOSED), + Value: utils.StringPointer(utils.DIRECTION)}, + &CdrFieldJsonCfg{Tag: utils.StringPointer("Tenant"), + Type: utils.StringPointer(utils.META_COMPOSED), + Value: utils.StringPointer(utils.TENANT)}, + &CdrFieldJsonCfg{Tag: utils.StringPointer("Category"), + Type: utils.StringPointer(utils.META_COMPOSED), + Value: utils.StringPointer(utils.CATEGORY)}, + &CdrFieldJsonCfg{Tag: utils.StringPointer("Account"), + Type: utils.StringPointer(utils.META_COMPOSED), + Value: utils.StringPointer(utils.ACCOUNT)}, + &CdrFieldJsonCfg{Tag: utils.StringPointer("Subject"), + Type: utils.StringPointer(utils.META_COMPOSED), + Value: utils.StringPointer(utils.SUBJECT)}, + &CdrFieldJsonCfg{Tag: utils.StringPointer("Destination"), + Type: utils.StringPointer(utils.META_COMPOSED), + Value: utils.StringPointer(utils.DESTINATION)}, + &CdrFieldJsonCfg{Tag: utils.StringPointer("SetupTime"), + Type: utils.StringPointer(utils.META_COMPOSED), + Value: utils.StringPointer(utils.SETUP_TIME), + Layout: utils.StringPointer("2006-01-02T15:04:05Z07:00")}, + &CdrFieldJsonCfg{Tag: utils.StringPointer("AnswerTime"), + Type: utils.StringPointer(utils.META_COMPOSED), + Value: utils.StringPointer(utils.ANSWER_TIME), + Layout: utils.StringPointer("2006-01-02T15:04:05Z07:00")}, + &CdrFieldJsonCfg{Tag: utils.StringPointer("Usage"), + Type: utils.StringPointer(utils.META_COMPOSED), + Value: utils.StringPointer(utils.USAGE)}, + &CdrFieldJsonCfg{Tag: utils.StringPointer("Cost"), + Type: utils.StringPointer(utils.META_COMPOSED), + Value: utils.StringPointer(utils.COST)}, + } eCfg := []*CdrcJsonCfg{ &CdrcJsonCfg{ Id: utils.StringPointer(utils.META_DEFAULT), @@ -317,6 +366,7 @@ func TestDfCdrcJsonCfg(t *testing.T) { Header_fields: &eFields, Content_fields: &cdrFields, Trailer_fields: &eFields, + Cache_dump_fields: &cacheDumpFields, }, } if cfg, err := dfCgrJsonCfg.CdrcJsonCfg(); err != nil { diff --git a/config/configcdrc_test.go b/config/configcdrc_test.go index e188589c5..6f7a8a5e0 100644 --- a/config/configcdrc_test.go +++ b/config/configcdrc_test.go @@ -79,6 +79,23 @@ func TestLoadCdrcConfigMultipleFiles(t *testing.T) { FieldFilter: utils.ParseRSRFieldsMustCompile("", utils.INFIELD_SEP), Width: 0, Strip: "", Padding: "", Layout: "", Mandatory: true}, }, TrailerFields: make([]*CfgCdrField, 0), + CacheDumpFields: []*CfgCdrField{ + &CfgCdrField{Tag: "CGRID", Type: utils.META_COMPOSED, Value: utils.ParseRSRFieldsMustCompile(utils.CGRID, utils.INFIELD_SEP)}, + &CfgCdrField{Tag: "RunID", Type: utils.META_COMPOSED, Value: utils.ParseRSRFieldsMustCompile(utils.MEDI_RUNID, utils.INFIELD_SEP)}, + &CfgCdrField{Tag: "TOR", Type: utils.META_COMPOSED, Value: utils.ParseRSRFieldsMustCompile(utils.TOR, utils.INFIELD_SEP)}, + &CfgCdrField{Tag: "OriginID", Type: utils.META_COMPOSED, Value: utils.ParseRSRFieldsMustCompile(utils.ACCID, utils.INFIELD_SEP)}, + &CfgCdrField{Tag: "RequestType", Type: utils.META_COMPOSED, Value: utils.ParseRSRFieldsMustCompile(utils.REQTYPE, utils.INFIELD_SEP)}, + &CfgCdrField{Tag: "Direction", Type: utils.META_COMPOSED, Value: utils.ParseRSRFieldsMustCompile(utils.DIRECTION, utils.INFIELD_SEP)}, + &CfgCdrField{Tag: "Tenant", Type: utils.META_COMPOSED, Value: utils.ParseRSRFieldsMustCompile(utils.TENANT, utils.INFIELD_SEP)}, + &CfgCdrField{Tag: "Category", Type: utils.META_COMPOSED, Value: utils.ParseRSRFieldsMustCompile(utils.CATEGORY, utils.INFIELD_SEP)}, + &CfgCdrField{Tag: "Account", Type: utils.META_COMPOSED, Value: utils.ParseRSRFieldsMustCompile(utils.ACCOUNT, utils.INFIELD_SEP)}, + &CfgCdrField{Tag: "Subject", Type: utils.META_COMPOSED, Value: utils.ParseRSRFieldsMustCompile(utils.SUBJECT, utils.INFIELD_SEP)}, + &CfgCdrField{Tag: "Destination", Type: utils.META_COMPOSED, Value: utils.ParseRSRFieldsMustCompile(utils.DESTINATION, utils.INFIELD_SEP)}, + &CfgCdrField{Tag: "SetupTime", Type: utils.META_COMPOSED, Value: utils.ParseRSRFieldsMustCompile(utils.SETUP_TIME, utils.INFIELD_SEP), Layout: "2006-01-02T15:04:05Z07:00"}, + &CfgCdrField{Tag: "AnswerTime", Type: utils.META_COMPOSED, Value: utils.ParseRSRFieldsMustCompile(utils.ANSWER_TIME, utils.INFIELD_SEP), Layout: "2006-01-02T15:04:05Z07:00"}, + &CfgCdrField{Tag: "Usage", Type: utils.META_COMPOSED, Value: utils.ParseRSRFieldsMustCompile(utils.USAGE, utils.INFIELD_SEP)}, + &CfgCdrField{Tag: "Cost", Type: utils.META_COMPOSED, Value: utils.ParseRSRFieldsMustCompile(utils.COST, utils.INFIELD_SEP)}, + }, }, } eCgrCfg.CdrcProfiles["/tmp/cgrates/cdrc1/in"] = []*CdrcConfig{ @@ -124,6 +141,23 @@ func TestLoadCdrcConfigMultipleFiles(t *testing.T) { FieldFilter: utils.ParseRSRFieldsMustCompile("", utils.INFIELD_SEP), Width: 0, Strip: "", Padding: "", Layout: "", Mandatory: true}, }, TrailerFields: make([]*CfgCdrField, 0), + CacheDumpFields: []*CfgCdrField{ + &CfgCdrField{Tag: "CGRID", Type: utils.META_COMPOSED, Value: utils.ParseRSRFieldsMustCompile(utils.CGRID, utils.INFIELD_SEP)}, + &CfgCdrField{Tag: "RunID", Type: utils.META_COMPOSED, Value: utils.ParseRSRFieldsMustCompile(utils.MEDI_RUNID, utils.INFIELD_SEP)}, + &CfgCdrField{Tag: "TOR", Type: utils.META_COMPOSED, Value: utils.ParseRSRFieldsMustCompile(utils.TOR, utils.INFIELD_SEP)}, + &CfgCdrField{Tag: "OriginID", Type: utils.META_COMPOSED, Value: utils.ParseRSRFieldsMustCompile(utils.ACCID, utils.INFIELD_SEP)}, + &CfgCdrField{Tag: "RequestType", Type: utils.META_COMPOSED, Value: utils.ParseRSRFieldsMustCompile(utils.REQTYPE, utils.INFIELD_SEP)}, + &CfgCdrField{Tag: "Direction", Type: utils.META_COMPOSED, Value: utils.ParseRSRFieldsMustCompile(utils.DIRECTION, utils.INFIELD_SEP)}, + &CfgCdrField{Tag: "Tenant", Type: utils.META_COMPOSED, Value: utils.ParseRSRFieldsMustCompile(utils.TENANT, utils.INFIELD_SEP)}, + &CfgCdrField{Tag: "Category", Type: utils.META_COMPOSED, Value: utils.ParseRSRFieldsMustCompile(utils.CATEGORY, utils.INFIELD_SEP)}, + &CfgCdrField{Tag: "Account", Type: utils.META_COMPOSED, Value: utils.ParseRSRFieldsMustCompile(utils.ACCOUNT, utils.INFIELD_SEP)}, + &CfgCdrField{Tag: "Subject", Type: utils.META_COMPOSED, Value: utils.ParseRSRFieldsMustCompile(utils.SUBJECT, utils.INFIELD_SEP)}, + &CfgCdrField{Tag: "Destination", Type: utils.META_COMPOSED, Value: utils.ParseRSRFieldsMustCompile(utils.DESTINATION, utils.INFIELD_SEP)}, + &CfgCdrField{Tag: "SetupTime", Type: utils.META_COMPOSED, Value: utils.ParseRSRFieldsMustCompile(utils.SETUP_TIME, utils.INFIELD_SEP), Layout: "2006-01-02T15:04:05Z07:00"}, + &CfgCdrField{Tag: "AnswerTime", Type: utils.META_COMPOSED, Value: utils.ParseRSRFieldsMustCompile(utils.ANSWER_TIME, utils.INFIELD_SEP), Layout: "2006-01-02T15:04:05Z07:00"}, + &CfgCdrField{Tag: "Usage", Type: utils.META_COMPOSED, Value: utils.ParseRSRFieldsMustCompile(utils.USAGE, utils.INFIELD_SEP)}, + &CfgCdrField{Tag: "Cost", Type: utils.META_COMPOSED, Value: utils.ParseRSRFieldsMustCompile(utils.COST, utils.INFIELD_SEP)}, + }, }, } eCgrCfg.CdrcProfiles["/tmp/cgrates/cdrc2/in"] = []*CdrcConfig{ @@ -151,6 +185,23 @@ func TestLoadCdrcConfigMultipleFiles(t *testing.T) { FieldFilter: utils.ParseRSRFieldsMustCompile("", utils.INFIELD_SEP), Width: 0, Strip: "", Padding: "", Layout: "", Mandatory: false}, }, TrailerFields: make([]*CfgCdrField, 0), + CacheDumpFields: []*CfgCdrField{ + &CfgCdrField{Tag: "CGRID", Type: utils.META_COMPOSED, Value: utils.ParseRSRFieldsMustCompile(utils.CGRID, utils.INFIELD_SEP)}, + &CfgCdrField{Tag: "RunID", Type: utils.META_COMPOSED, Value: utils.ParseRSRFieldsMustCompile(utils.MEDI_RUNID, utils.INFIELD_SEP)}, + &CfgCdrField{Tag: "TOR", Type: utils.META_COMPOSED, Value: utils.ParseRSRFieldsMustCompile(utils.TOR, utils.INFIELD_SEP)}, + &CfgCdrField{Tag: "OriginID", Type: utils.META_COMPOSED, Value: utils.ParseRSRFieldsMustCompile(utils.ACCID, utils.INFIELD_SEP)}, + &CfgCdrField{Tag: "RequestType", Type: utils.META_COMPOSED, Value: utils.ParseRSRFieldsMustCompile(utils.REQTYPE, utils.INFIELD_SEP)}, + &CfgCdrField{Tag: "Direction", Type: utils.META_COMPOSED, Value: utils.ParseRSRFieldsMustCompile(utils.DIRECTION, utils.INFIELD_SEP)}, + &CfgCdrField{Tag: "Tenant", Type: utils.META_COMPOSED, Value: utils.ParseRSRFieldsMustCompile(utils.TENANT, utils.INFIELD_SEP)}, + &CfgCdrField{Tag: "Category", Type: utils.META_COMPOSED, Value: utils.ParseRSRFieldsMustCompile(utils.CATEGORY, utils.INFIELD_SEP)}, + &CfgCdrField{Tag: "Account", Type: utils.META_COMPOSED, Value: utils.ParseRSRFieldsMustCompile(utils.ACCOUNT, utils.INFIELD_SEP)}, + &CfgCdrField{Tag: "Subject", Type: utils.META_COMPOSED, Value: utils.ParseRSRFieldsMustCompile(utils.SUBJECT, utils.INFIELD_SEP)}, + &CfgCdrField{Tag: "Destination", Type: utils.META_COMPOSED, Value: utils.ParseRSRFieldsMustCompile(utils.DESTINATION, utils.INFIELD_SEP)}, + &CfgCdrField{Tag: "SetupTime", Type: utils.META_COMPOSED, Value: utils.ParseRSRFieldsMustCompile(utils.SETUP_TIME, utils.INFIELD_SEP), Layout: "2006-01-02T15:04:05Z07:00"}, + &CfgCdrField{Tag: "AnswerTime", Type: utils.META_COMPOSED, Value: utils.ParseRSRFieldsMustCompile(utils.ANSWER_TIME, utils.INFIELD_SEP), Layout: "2006-01-02T15:04:05Z07:00"}, + &CfgCdrField{Tag: "Usage", Type: utils.META_COMPOSED, Value: utils.ParseRSRFieldsMustCompile(utils.USAGE, utils.INFIELD_SEP)}, + &CfgCdrField{Tag: "Cost", Type: utils.META_COMPOSED, Value: utils.ParseRSRFieldsMustCompile(utils.COST, utils.INFIELD_SEP)}, + }, }, } eCgrCfg.CdrcProfiles["/tmp/cgrates/cdrc3/in"] = []*CdrcConfig{ @@ -196,6 +247,23 @@ func TestLoadCdrcConfigMultipleFiles(t *testing.T) { FieldFilter: utils.ParseRSRFieldsMustCompile("", utils.INFIELD_SEP), Width: 0, Strip: "", Padding: "", Layout: "", Mandatory: true}, }, TrailerFields: make([]*CfgCdrField, 0), + CacheDumpFields: []*CfgCdrField{ + &CfgCdrField{Tag: "CGRID", Type: utils.META_COMPOSED, Value: utils.ParseRSRFieldsMustCompile(utils.CGRID, utils.INFIELD_SEP)}, + &CfgCdrField{Tag: "RunID", Type: utils.META_COMPOSED, Value: utils.ParseRSRFieldsMustCompile(utils.MEDI_RUNID, utils.INFIELD_SEP)}, + &CfgCdrField{Tag: "TOR", Type: utils.META_COMPOSED, Value: utils.ParseRSRFieldsMustCompile(utils.TOR, utils.INFIELD_SEP)}, + &CfgCdrField{Tag: "OriginID", Type: utils.META_COMPOSED, Value: utils.ParseRSRFieldsMustCompile(utils.ACCID, utils.INFIELD_SEP)}, + &CfgCdrField{Tag: "RequestType", Type: utils.META_COMPOSED, Value: utils.ParseRSRFieldsMustCompile(utils.REQTYPE, utils.INFIELD_SEP)}, + &CfgCdrField{Tag: "Direction", Type: utils.META_COMPOSED, Value: utils.ParseRSRFieldsMustCompile(utils.DIRECTION, utils.INFIELD_SEP)}, + &CfgCdrField{Tag: "Tenant", Type: utils.META_COMPOSED, Value: utils.ParseRSRFieldsMustCompile(utils.TENANT, utils.INFIELD_SEP)}, + &CfgCdrField{Tag: "Category", Type: utils.META_COMPOSED, Value: utils.ParseRSRFieldsMustCompile(utils.CATEGORY, utils.INFIELD_SEP)}, + &CfgCdrField{Tag: "Account", Type: utils.META_COMPOSED, Value: utils.ParseRSRFieldsMustCompile(utils.ACCOUNT, utils.INFIELD_SEP)}, + &CfgCdrField{Tag: "Subject", Type: utils.META_COMPOSED, Value: utils.ParseRSRFieldsMustCompile(utils.SUBJECT, utils.INFIELD_SEP)}, + &CfgCdrField{Tag: "Destination", Type: utils.META_COMPOSED, Value: utils.ParseRSRFieldsMustCompile(utils.DESTINATION, utils.INFIELD_SEP)}, + &CfgCdrField{Tag: "SetupTime", Type: utils.META_COMPOSED, Value: utils.ParseRSRFieldsMustCompile(utils.SETUP_TIME, utils.INFIELD_SEP), Layout: "2006-01-02T15:04:05Z07:00"}, + &CfgCdrField{Tag: "AnswerTime", Type: utils.META_COMPOSED, Value: utils.ParseRSRFieldsMustCompile(utils.ANSWER_TIME, utils.INFIELD_SEP), Layout: "2006-01-02T15:04:05Z07:00"}, + &CfgCdrField{Tag: "Usage", Type: utils.META_COMPOSED, Value: utils.ParseRSRFieldsMustCompile(utils.USAGE, utils.INFIELD_SEP)}, + &CfgCdrField{Tag: "Cost", Type: utils.META_COMPOSED, Value: utils.ParseRSRFieldsMustCompile(utils.COST, utils.INFIELD_SEP)}, + }, }, } if !reflect.DeepEqual(eCgrCfg.CdrcProfiles, cgrCfg.CdrcProfiles) { diff --git a/config/libconfig_json.go b/config/libconfig_json.go index 40a0b8163..e8c0a6079 100644 --- a/config/libconfig_json.go +++ b/config/libconfig_json.go @@ -169,6 +169,7 @@ type CdrcJsonCfg struct { Header_fields *[]*CdrFieldJsonCfg Content_fields *[]*CdrFieldJsonCfg Trailer_fields *[]*CdrFieldJsonCfg + Cache_dump_fields *[]*CdrFieldJsonCfg } // SM-Generic config section