CdrExporter does not longer make differences between .csv and .fwv formats handling, treating fields mandatory property also

This commit is contained in:
DanB
2014-07-15 11:59:46 +02:00
parent 31a573fde4
commit 430da9b714
7 changed files with 146 additions and 177 deletions

View File

@@ -59,7 +59,8 @@ func (self *ApierV1) ExportCdrsToFile(attr utils.AttrExpFileCdrs, reply *utils.E
}
} else {
exportTemplate, _ = config.NewDefaultCdreConfig()
if contentFlds, err := config.NewCdreCdrFieldsFromIds(strings.Split(*attr.ExportTemplate, string(utils.CSV_SEP))...); err != nil {
if contentFlds, err := config.NewCdreCdrFieldsFromIds(exportTemplate.CdrFormat == utils.CDRE_FIXED_WIDTH,
strings.Split(*attr.ExportTemplate, string(utils.CSV_SEP))...); err != nil {
return fmt.Errorf("%s:%s", utils.ERR_SERVER_ERROR, err.Error())
} else {
exportTemplate.ContentFields = contentFlds

View File

@@ -241,11 +241,9 @@ func (cdre *CdrExporter) composeHeader() error {
return err
}
fmtOut := outVal
if cdre.cdrFormat == utils.CDRE_FIXED_WIDTH {
if fmtOut, err = FmtFieldWidth(outVal, cfgFld.Width, cfgFld.Strip, cfgFld.Padding, cfgFld.Mandatory); err != nil {
engine.Logger.Err(fmt.Sprintf("<CdreFw> Cannot export CDR header, field %s, error: %s", cfgFld.Name, err.Error()))
return err
}
if fmtOut, err = FmtFieldWidth(outVal, cfgFld.Width, cfgFld.Strip, cfgFld.Padding, cfgFld.Mandatory); err != nil {
engine.Logger.Err(fmt.Sprintf("<CdreFw> Cannot export CDR header, field %s, error: %s", cfgFld.Name, err.Error()))
return err
}
cdre.header = append(cdre.header, fmtOut)
}
@@ -272,11 +270,9 @@ func (cdre *CdrExporter) composeTrailer() error {
return err
}
fmtOut := outVal
if cdre.cdrFormat == utils.CDRE_FIXED_WIDTH {
if fmtOut, err = FmtFieldWidth(outVal, cfgFld.Width, cfgFld.Strip, cfgFld.Padding, cfgFld.Mandatory); err != nil {
engine.Logger.Err(fmt.Sprintf("<CdreFw> Cannot export CDR trailer, field: %s, error: %s", cfgFld.Name, err.Error()))
return err
}
if fmtOut, err = FmtFieldWidth(outVal, cfgFld.Width, cfgFld.Strip, cfgFld.Padding, cfgFld.Mandatory); err != nil {
engine.Logger.Err(fmt.Sprintf("<CdreFw> Cannot export CDR trailer, field: %s, error: %s", cfgFld.Name, err.Error()))
return err
}
cdre.trailer = append(cdre.trailer, fmtOut)
}
@@ -338,11 +334,9 @@ func (cdre *CdrExporter) processCdr(cdr *utils.StoredCdr) error {
return err
}
fmtOut := outVal
if cdre.cdrFormat == utils.CDRE_FIXED_WIDTH {
if fmtOut, err = FmtFieldWidth(outVal, cfgFld.Width, cfgFld.Strip, cfgFld.Padding, cfgFld.Mandatory); err != nil {
engine.Logger.Err(fmt.Sprintf("<CdreFw> Cannot export CDR with cgrid: %s, runid: %s, fieldName: %s, fieldValue: %s, error: %s", cdr.CgrId, cdr.MediationRunId, cfgFld.Name, outVal, err.Error()))
return err
}
if fmtOut, err = FmtFieldWidth(outVal, cfgFld.Width, cfgFld.Strip, cfgFld.Padding, cfgFld.Mandatory); err != nil {
engine.Logger.Err(fmt.Sprintf("<CdreFw> Cannot export CDR with cgrid: %s, runid: %s, fieldName: %s, fieldValue: %s, error: %s", cdr.CgrId, cdr.MediationRunId, cfgFld.Name, outVal, err.Error()))
return err
}
cdrRow[idx] += fmtOut
}
@@ -362,8 +356,10 @@ func (cdre *CdrExporter) processCdr(cdr *utils.StoredCdr) error {
if !utils.IsSliceMember([]string{utils.DATA, utils.SMS}, cdr.TOR) { // Only count duration for non data cdrs
cdre.totalDuration += cdr.Usage
}
cdre.totalCost += cdr.Cost
cdre.totalCost = utils.Round(cdre.totalCost, cdre.roundDecimals, utils.ROUNDING_MIDDLE)
if cdr.Cost != -1 {
cdre.totalCost += cdr.Cost
cdre.totalCost = utils.Round(cdre.totalCost, cdre.roundDecimals, utils.ROUNDING_MIDDLE)
}
if cdre.firstExpOrderId > cdr.OrderId || cdre.firstExpOrderId == 0 {
cdre.firstExpOrderId = cdr.OrderId
}

View File

@@ -35,6 +35,9 @@ func FmtFieldWidth(source string, width int, strip, padding string, mandatory bo
if mandatory && len(source) == 0 {
return "", errors.New("Empty source value")
}
if width == 0 { // Disable width processing if not defined
return source, nil
}
if len(source) == width { // the source is exactly the maximum length
return source, nil
}

View File

@@ -24,15 +24,16 @@ import (
)
// Converts a list of field identifiers into proper CDR field content
func NewCdreCdrFieldsFromIds(fldsIds ...string) ([]*CdreCdrField, error) {
func NewCdreCdrFieldsFromIds(withFixedWith bool, fldsIds ...string) ([]*CdreCdrField, error) {
cdrFields := make([]*CdreCdrField, len(fldsIds))
for idx, fldId := range fldsIds {
if parsedRsr, err := utils.NewRSRField(fldId); err != nil {
return nil, err
} else {
cdrFld := &CdreCdrField{Name: fldId, Type: utils.CDRFIELD, Value: fldId, valueAsRsrField: parsedRsr}
if err := cdrFld.setDefaultFixedWidthProperties(); err != nil { // Set default fixed width properties to be used later if needed
if err := cdrFld.setDefaultFieldProperties(withFixedWith); err != nil { // Set default fixed width properties to be used later if needed
return nil, err
}
cdrFields[idx] = cdrFld
}
@@ -73,7 +74,7 @@ func (cdreCfg *CdreConfig) setDefaults() error {
cdreCfg.MaskDestId = ""
cdreCfg.MaskLength = 0
cdreCfg.ExportDir = "/var/log/cgrates/cdre"
if flds, err := NewCdreCdrFieldsFromIds(utils.CGRID, utils.MEDI_RUNID, utils.TOR, utils.ACCID, utils.REQTYPE, utils.DIRECTION, utils.TENANT,
if flds, err := NewCdreCdrFieldsFromIds(false, utils.CGRID, utils.MEDI_RUNID, utils.TOR, utils.ACCID, utils.REQTYPE, utils.DIRECTION, utils.TENANT,
utils.CATEGORY, utils.ACCOUNT, utils.SUBJECT, utils.DESTINATION, utils.SETUP_TIME, utils.ANSWER_TIME, utils.USAGE, utils.COST); err != nil {
return err
} else {
@@ -100,125 +101,142 @@ func (cdrField *CdreCdrField) ValueAsRSRField() *utils.RSRField {
}
// Should be called on .fwv configuration without providing default values for fixed with parameters
func (cdrField *CdreCdrField) setDefaultFixedWidthProperties() error {
func (cdrField *CdreCdrField) setDefaultFieldProperties(fixedWidth bool) error {
if cdrField.valueAsRsrField == nil {
return errors.New("Missing valueAsRsrField")
}
switch cdrField.valueAsRsrField.Id {
case utils.CGRID:
cdrField.Width = 40
cdrField.Strip = ""
cdrField.Padding = ""
cdrField.Layout = ""
cdrField.Mandatory = true
if fixedWidth {
cdrField.Width = 40
}
case utils.ORDERID:
cdrField.Width = 11
cdrField.Strip = ""
cdrField.Padding = "left"
cdrField.Layout = ""
cdrField.Mandatory = true
if fixedWidth {
cdrField.Width = 11
cdrField.Padding = "left"
}
case utils.TOR:
cdrField.Width = 6
cdrField.Strip = ""
cdrField.Padding = "left"
cdrField.Layout = ""
cdrField.Mandatory = true
if fixedWidth {
cdrField.Width = 6
cdrField.Padding = "left"
}
case utils.ACCID:
cdrField.Width = 36
cdrField.Strip = "left"
cdrField.Padding = "left"
cdrField.Layout = ""
cdrField.Mandatory = true
if fixedWidth {
cdrField.Width = 36
cdrField.Strip = "left"
cdrField.Padding = "left"
}
case utils.CDRHOST:
cdrField.Width = 15
cdrField.Strip = "left"
cdrField.Padding = "left"
cdrField.Layout = ""
cdrField.Mandatory = true
if fixedWidth {
cdrField.Width = 15
cdrField.Strip = "left"
cdrField.Padding = "left"
}
case utils.CDRSOURCE:
cdrField.Width = 15
cdrField.Strip = "xright"
cdrField.Padding = "left"
cdrField.Layout = ""
cdrField.Mandatory = true
if fixedWidth {
cdrField.Width = 15
cdrField.Strip = "xright"
cdrField.Padding = "left"
}
case utils.REQTYPE:
cdrField.Width = 13
cdrField.Strip = "xright"
cdrField.Padding = "left"
cdrField.Layout = ""
cdrField.Mandatory = true
if fixedWidth {
cdrField.Width = 13
cdrField.Strip = "xright"
cdrField.Padding = "left"
}
case utils.DIRECTION:
cdrField.Width = 4
cdrField.Strip = "xright"
cdrField.Padding = "left"
cdrField.Layout = ""
cdrField.Mandatory = true
if fixedWidth {
cdrField.Width = 4
cdrField.Strip = "xright"
cdrField.Padding = "left"
}
case utils.TENANT:
cdrField.Width = 24
cdrField.Strip = "xright"
cdrField.Padding = "left"
cdrField.Layout = ""
cdrField.Mandatory = true
if fixedWidth {
cdrField.Width = 24
cdrField.Strip = "xright"
cdrField.Padding = "left"
}
case utils.CATEGORY:
cdrField.Width = 10
cdrField.Strip = "xright"
cdrField.Padding = "left"
cdrField.Layout = ""
cdrField.Mandatory = true
if fixedWidth {
cdrField.Width = 10
cdrField.Strip = "xright"
cdrField.Padding = "left"
}
case utils.ACCOUNT:
cdrField.Width = 24
cdrField.Strip = "xright"
cdrField.Padding = "left"
cdrField.Layout = ""
cdrField.Mandatory = true
if fixedWidth {
cdrField.Width = 24
cdrField.Strip = "xright"
cdrField.Padding = "left"
}
case utils.SUBJECT:
cdrField.Width = 24
cdrField.Strip = "xright"
cdrField.Padding = "left"
cdrField.Layout = ""
cdrField.Mandatory = true
if fixedWidth {
cdrField.Width = 24
cdrField.Strip = "xright"
cdrField.Padding = "left"
}
case utils.DESTINATION:
cdrField.Width = 24
cdrField.Strip = "xright"
cdrField.Padding = "left"
cdrField.Layout = ""
cdrField.Mandatory = true
if fixedWidth {
cdrField.Width = 24
cdrField.Strip = "xright"
cdrField.Padding = "left"
}
case utils.SETUP_TIME:
cdrField.Width = 30
cdrField.Strip = "xright"
cdrField.Padding = "left"
cdrField.Layout = "2006-01-02T15:04:05Z07:00"
cdrField.Mandatory = true
if fixedWidth {
cdrField.Width = 30
cdrField.Strip = "xright"
cdrField.Padding = "left"
cdrField.Layout = "2006-01-02T15:04:05Z07:00"
}
case utils.ANSWER_TIME:
cdrField.Width = 30
cdrField.Strip = "xright"
cdrField.Padding = "left"
cdrField.Layout = "2006-01-02T15:04:05Z07:00"
cdrField.Mandatory = true
if fixedWidth {
cdrField.Width = 30
cdrField.Strip = "xright"
cdrField.Padding = "left"
cdrField.Layout = "2006-01-02T15:04:05Z07:00"
}
case utils.USAGE:
cdrField.Width = 30
cdrField.Strip = "xright"
cdrField.Padding = "left"
cdrField.Layout = ""
cdrField.Mandatory = true
if fixedWidth {
cdrField.Width = 30
cdrField.Strip = "xright"
cdrField.Padding = "left"
}
case utils.MEDI_RUNID:
cdrField.Width = 20
cdrField.Strip = "xright"
cdrField.Padding = "left"
cdrField.Layout = ""
cdrField.Mandatory = true
if fixedWidth {
cdrField.Width = 20
cdrField.Strip = "xright"
cdrField.Padding = "left"
}
case utils.COST:
cdrField.Width = 24
cdrField.Strip = "xright"
cdrField.Padding = "left"
cdrField.Layout = ""
cdrField.Mandatory = true
if fixedWidth {
cdrField.Width = 24
cdrField.Strip = "xright"
cdrField.Padding = "left"
}
default:
cdrField.Width = 30
cdrField.Strip = "xright"
cdrField.Padding = "left"
cdrField.Layout = ""
cdrField.Mandatory = false
if fixedWidth {
cdrField.Width = 30
cdrField.Strip = "xright"
cdrField.Padding = "left"
}
}
return nil
}

View File

@@ -49,7 +49,7 @@ func TestCdreCfgNewCdreCdrFieldsFromIds(t *testing.T) {
valueAsRsrField: &utils.RSRField{Id: "extra1"},
},
}
if cdreFlds, err := NewCdreCdrFieldsFromIds(utils.CGRID, "extra1"); err != nil {
if cdreFlds, err := NewCdreCdrFieldsFromIds(true, utils.CGRID, "extra1"); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(expectedFlds, cdreFlds) {
t.Errorf("Expected: %v, received: %v", expectedFlds, cdreFlds)
@@ -86,7 +86,6 @@ func TestCdreCfgNewDefaultCdreConfig(t *testing.T) {
Name: utils.CGRID,
Type: utils.CDRFIELD,
Value: utils.CGRID,
Width: 40,
Mandatory: true,
valueAsRsrField: &utils.RSRField{Id: utils.CGRID},
},
@@ -94,9 +93,6 @@ func TestCdreCfgNewDefaultCdreConfig(t *testing.T) {
Name: utils.MEDI_RUNID,
Type: utils.CDRFIELD,
Value: utils.MEDI_RUNID,
Width: 20,
Strip: "xright",
Padding: "left",
Mandatory: true,
valueAsRsrField: &utils.RSRField{Id: utils.MEDI_RUNID},
},
@@ -104,8 +100,6 @@ func TestCdreCfgNewDefaultCdreConfig(t *testing.T) {
Name: utils.TOR,
Type: utils.CDRFIELD,
Value: utils.TOR,
Width: 6,
Padding: "left",
Mandatory: true,
valueAsRsrField: &utils.RSRField{Id: utils.TOR},
},
@@ -113,9 +107,6 @@ func TestCdreCfgNewDefaultCdreConfig(t *testing.T) {
Name: utils.ACCID,
Type: utils.CDRFIELD,
Value: utils.ACCID,
Width: 36,
Strip: "left",
Padding: "left",
Mandatory: true,
valueAsRsrField: &utils.RSRField{Id: utils.ACCID},
},
@@ -123,9 +114,6 @@ func TestCdreCfgNewDefaultCdreConfig(t *testing.T) {
Name: utils.REQTYPE,
Type: utils.CDRFIELD,
Value: utils.REQTYPE,
Width: 13,
Strip: "xright",
Padding: "left",
Mandatory: true,
valueAsRsrField: &utils.RSRField{Id: utils.REQTYPE},
},
@@ -133,9 +121,6 @@ func TestCdreCfgNewDefaultCdreConfig(t *testing.T) {
Name: utils.DIRECTION,
Type: utils.CDRFIELD,
Value: utils.DIRECTION,
Width: 4,
Strip: "xright",
Padding: "left",
Mandatory: true,
valueAsRsrField: &utils.RSRField{Id: utils.DIRECTION},
},
@@ -143,9 +128,6 @@ func TestCdreCfgNewDefaultCdreConfig(t *testing.T) {
Name: utils.TENANT,
Type: utils.CDRFIELD,
Value: utils.TENANT,
Width: 24,
Strip: "xright",
Padding: "left",
Mandatory: true,
valueAsRsrField: &utils.RSRField{Id: utils.TENANT},
},
@@ -153,9 +135,6 @@ func TestCdreCfgNewDefaultCdreConfig(t *testing.T) {
Name: utils.CATEGORY,
Type: utils.CDRFIELD,
Value: utils.CATEGORY,
Width: 10,
Strip: "xright",
Padding: "left",
Mandatory: true,
valueAsRsrField: &utils.RSRField{Id: utils.CATEGORY},
},
@@ -163,9 +142,6 @@ func TestCdreCfgNewDefaultCdreConfig(t *testing.T) {
Name: utils.ACCOUNT,
Type: utils.CDRFIELD,
Value: utils.ACCOUNT,
Width: 24,
Strip: "xright",
Padding: "left",
Mandatory: true,
valueAsRsrField: &utils.RSRField{Id: utils.ACCOUNT},
},
@@ -173,9 +149,6 @@ func TestCdreCfgNewDefaultCdreConfig(t *testing.T) {
Name: utils.SUBJECT,
Type: utils.CDRFIELD,
Value: utils.SUBJECT,
Width: 24,
Strip: "xright",
Padding: "left",
Mandatory: true,
valueAsRsrField: &utils.RSRField{Id: utils.SUBJECT},
},
@@ -183,9 +156,6 @@ func TestCdreCfgNewDefaultCdreConfig(t *testing.T) {
Name: utils.DESTINATION,
Type: utils.CDRFIELD,
Value: utils.DESTINATION,
Width: 24,
Strip: "xright",
Padding: "left",
Mandatory: true,
valueAsRsrField: &utils.RSRField{Id: utils.DESTINATION},
},
@@ -193,10 +163,6 @@ func TestCdreCfgNewDefaultCdreConfig(t *testing.T) {
Name: utils.SETUP_TIME,
Type: utils.CDRFIELD,
Value: utils.SETUP_TIME,
Width: 30,
Strip: "xright",
Padding: "left",
Layout: "2006-01-02T15:04:05Z07:00",
Mandatory: true,
valueAsRsrField: &utils.RSRField{Id: utils.SETUP_TIME},
},
@@ -204,10 +170,6 @@ func TestCdreCfgNewDefaultCdreConfig(t *testing.T) {
Name: utils.ANSWER_TIME,
Type: utils.CDRFIELD,
Value: utils.ANSWER_TIME,
Width: 30,
Strip: "xright",
Padding: "left",
Layout: "2006-01-02T15:04:05Z07:00",
Mandatory: true,
valueAsRsrField: &utils.RSRField{Id: utils.ANSWER_TIME},
},
@@ -215,9 +177,6 @@ func TestCdreCfgNewDefaultCdreConfig(t *testing.T) {
Name: utils.USAGE,
Type: utils.CDRFIELD,
Value: utils.USAGE,
Width: 30,
Strip: "xright",
Padding: "left",
Mandatory: true,
valueAsRsrField: &utils.RSRField{Id: utils.USAGE},
},
@@ -225,9 +184,6 @@ func TestCdreCfgNewDefaultCdreConfig(t *testing.T) {
Name: utils.COST,
Type: utils.CDRFIELD,
Value: utils.COST,
Width: 24,
Strip: "xright",
Padding: "left",
Mandatory: true,
valueAsRsrField: &utils.RSRField{Id: utils.COST},
},
@@ -239,7 +195,7 @@ func TestCdreCfgNewDefaultCdreConfig(t *testing.T) {
}
}
func TestCdreCfgSetDefaultFixedWidthProperties(t *testing.T) {
func TestCdreCfgSetDefaultFieldProperties(t *testing.T) {
cdreCdrFld := &CdreCdrField{
valueAsRsrField: &utils.RSRField{Id: utils.CGRID},
}
@@ -248,7 +204,7 @@ func TestCdreCfgSetDefaultFixedWidthProperties(t *testing.T) {
Mandatory: true,
valueAsRsrField: &utils.RSRField{Id: utils.CGRID},
}
if err := cdreCdrFld.setDefaultFixedWidthProperties(); err != nil {
if err := cdreCdrFld.setDefaultFieldProperties(true); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(eCdreCdrFld, cdreCdrFld) {
t.Errorf("Expecting: %v, received: %v", eCdreCdrFld, cdreCdrFld)
@@ -262,7 +218,7 @@ func TestCdreCfgSetDefaultFixedWidthProperties(t *testing.T) {
Mandatory: true,
valueAsRsrField: &utils.RSRField{Id: utils.ORDERID},
}
if err := cdreCdrFld.setDefaultFixedWidthProperties(); err != nil {
if err := cdreCdrFld.setDefaultFieldProperties(true); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(eCdreCdrFld, cdreCdrFld) {
t.Errorf("Expecting: %v, received: %v", eCdreCdrFld, cdreCdrFld)
@@ -276,7 +232,7 @@ func TestCdreCfgSetDefaultFixedWidthProperties(t *testing.T) {
Mandatory: true,
valueAsRsrField: &utils.RSRField{Id: utils.TOR},
}
if err := cdreCdrFld.setDefaultFixedWidthProperties(); err != nil {
if err := cdreCdrFld.setDefaultFieldProperties(true); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(eCdreCdrFld, cdreCdrFld) {
t.Errorf("Expecting: %v, received: %v", eCdreCdrFld, cdreCdrFld)
@@ -291,7 +247,7 @@ func TestCdreCfgSetDefaultFixedWidthProperties(t *testing.T) {
Mandatory: true,
valueAsRsrField: &utils.RSRField{Id: utils.ACCID},
}
if err := cdreCdrFld.setDefaultFixedWidthProperties(); err != nil {
if err := cdreCdrFld.setDefaultFieldProperties(true); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(eCdreCdrFld, cdreCdrFld) {
t.Errorf("Expecting: %v, received: %v", eCdreCdrFld, cdreCdrFld)
@@ -306,7 +262,7 @@ func TestCdreCfgSetDefaultFixedWidthProperties(t *testing.T) {
Mandatory: true,
valueAsRsrField: &utils.RSRField{Id: utils.CDRHOST},
}
if err := cdreCdrFld.setDefaultFixedWidthProperties(); err != nil {
if err := cdreCdrFld.setDefaultFieldProperties(true); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(eCdreCdrFld, cdreCdrFld) {
t.Errorf("Expecting: %v, received: %v", eCdreCdrFld, cdreCdrFld)
@@ -321,7 +277,7 @@ func TestCdreCfgSetDefaultFixedWidthProperties(t *testing.T) {
Mandatory: true,
valueAsRsrField: &utils.RSRField{Id: utils.CDRSOURCE},
}
if err := cdreCdrFld.setDefaultFixedWidthProperties(); err != nil {
if err := cdreCdrFld.setDefaultFieldProperties(true); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(eCdreCdrFld, cdreCdrFld) {
t.Errorf("Expecting: %v, received: %v", eCdreCdrFld, cdreCdrFld)
@@ -336,7 +292,7 @@ func TestCdreCfgSetDefaultFixedWidthProperties(t *testing.T) {
Mandatory: true,
valueAsRsrField: &utils.RSRField{Id: utils.REQTYPE},
}
if err := cdreCdrFld.setDefaultFixedWidthProperties(); err != nil {
if err := cdreCdrFld.setDefaultFieldProperties(true); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(eCdreCdrFld, cdreCdrFld) {
t.Errorf("Expecting: %v, received: %v", eCdreCdrFld, cdreCdrFld)
@@ -351,7 +307,7 @@ func TestCdreCfgSetDefaultFixedWidthProperties(t *testing.T) {
Mandatory: true,
valueAsRsrField: &utils.RSRField{Id: utils.DIRECTION},
}
if err := cdreCdrFld.setDefaultFixedWidthProperties(); err != nil {
if err := cdreCdrFld.setDefaultFieldProperties(true); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(eCdreCdrFld, cdreCdrFld) {
t.Errorf("Expecting: %v, received: %v", eCdreCdrFld, cdreCdrFld)
@@ -366,7 +322,7 @@ func TestCdreCfgSetDefaultFixedWidthProperties(t *testing.T) {
Mandatory: true,
valueAsRsrField: &utils.RSRField{Id: utils.TENANT},
}
if err := cdreCdrFld.setDefaultFixedWidthProperties(); err != nil {
if err := cdreCdrFld.setDefaultFieldProperties(true); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(eCdreCdrFld, cdreCdrFld) {
t.Errorf("Expecting: %v, received: %v", eCdreCdrFld, cdreCdrFld)
@@ -381,7 +337,7 @@ func TestCdreCfgSetDefaultFixedWidthProperties(t *testing.T) {
Mandatory: true,
valueAsRsrField: &utils.RSRField{Id: utils.CATEGORY},
}
if err := cdreCdrFld.setDefaultFixedWidthProperties(); err != nil {
if err := cdreCdrFld.setDefaultFieldProperties(true); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(eCdreCdrFld, cdreCdrFld) {
t.Errorf("Expecting: %v, received: %v", eCdreCdrFld, cdreCdrFld)
@@ -396,7 +352,7 @@ func TestCdreCfgSetDefaultFixedWidthProperties(t *testing.T) {
Mandatory: true,
valueAsRsrField: &utils.RSRField{Id: utils.ACCOUNT},
}
if err := cdreCdrFld.setDefaultFixedWidthProperties(); err != nil {
if err := cdreCdrFld.setDefaultFieldProperties(true); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(eCdreCdrFld, cdreCdrFld) {
t.Errorf("Expecting: %v, received: %v", eCdreCdrFld, cdreCdrFld)
@@ -411,7 +367,7 @@ func TestCdreCfgSetDefaultFixedWidthProperties(t *testing.T) {
Mandatory: true,
valueAsRsrField: &utils.RSRField{Id: utils.SUBJECT},
}
if err := cdreCdrFld.setDefaultFixedWidthProperties(); err != nil {
if err := cdreCdrFld.setDefaultFieldProperties(true); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(eCdreCdrFld, cdreCdrFld) {
t.Errorf("Expecting: %v, received: %v", eCdreCdrFld, cdreCdrFld)
@@ -426,7 +382,7 @@ func TestCdreCfgSetDefaultFixedWidthProperties(t *testing.T) {
Mandatory: true,
valueAsRsrField: &utils.RSRField{Id: utils.DESTINATION},
}
if err := cdreCdrFld.setDefaultFixedWidthProperties(); err != nil {
if err := cdreCdrFld.setDefaultFieldProperties(true); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(eCdreCdrFld, cdreCdrFld) {
t.Errorf("Expecting: %v, received: %v", eCdreCdrFld, cdreCdrFld)
@@ -442,7 +398,7 @@ func TestCdreCfgSetDefaultFixedWidthProperties(t *testing.T) {
Mandatory: true,
valueAsRsrField: &utils.RSRField{Id: utils.SETUP_TIME},
}
if err := cdreCdrFld.setDefaultFixedWidthProperties(); err != nil {
if err := cdreCdrFld.setDefaultFieldProperties(true); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(eCdreCdrFld, cdreCdrFld) {
t.Errorf("Expecting: %v, received: %v", eCdreCdrFld, cdreCdrFld)
@@ -458,7 +414,7 @@ func TestCdreCfgSetDefaultFixedWidthProperties(t *testing.T) {
Mandatory: true,
valueAsRsrField: &utils.RSRField{Id: utils.ANSWER_TIME},
}
if err := cdreCdrFld.setDefaultFixedWidthProperties(); err != nil {
if err := cdreCdrFld.setDefaultFieldProperties(true); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(eCdreCdrFld, cdreCdrFld) {
t.Errorf("Expecting: %v, received: %v", eCdreCdrFld, cdreCdrFld)
@@ -473,7 +429,7 @@ func TestCdreCfgSetDefaultFixedWidthProperties(t *testing.T) {
Mandatory: true,
valueAsRsrField: &utils.RSRField{Id: utils.USAGE},
}
if err := cdreCdrFld.setDefaultFixedWidthProperties(); err != nil {
if err := cdreCdrFld.setDefaultFieldProperties(true); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(eCdreCdrFld, cdreCdrFld) {
t.Errorf("Expecting: %v, received: %v", eCdreCdrFld, cdreCdrFld)
@@ -488,7 +444,7 @@ func TestCdreCfgSetDefaultFixedWidthProperties(t *testing.T) {
Mandatory: true,
valueAsRsrField: &utils.RSRField{Id: utils.MEDI_RUNID},
}
if err := cdreCdrFld.setDefaultFixedWidthProperties(); err != nil {
if err := cdreCdrFld.setDefaultFieldProperties(true); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(eCdreCdrFld, cdreCdrFld) {
t.Errorf("Expecting: %v, received: %v", eCdreCdrFld, cdreCdrFld)
@@ -503,7 +459,7 @@ func TestCdreCfgSetDefaultFixedWidthProperties(t *testing.T) {
Mandatory: true,
valueAsRsrField: &utils.RSRField{Id: utils.COST},
}
if err := cdreCdrFld.setDefaultFixedWidthProperties(); err != nil {
if err := cdreCdrFld.setDefaultFieldProperties(true); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(eCdreCdrFld, cdreCdrFld) {
t.Errorf("Expecting: %v, received: %v", eCdreCdrFld, cdreCdrFld)
@@ -518,7 +474,7 @@ func TestCdreCfgSetDefaultFixedWidthProperties(t *testing.T) {
Mandatory: false,
valueAsRsrField: &utils.RSRField{Id: "extra_1"},
}
if err := cdreCdrFld.setDefaultFixedWidthProperties(); err != nil {
if err := cdreCdrFld.setDefaultFieldProperties(true); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(eCdreCdrFld, cdreCdrFld) {
t.Errorf("Expecting: %v, received: %v", eCdreCdrFld, cdreCdrFld)

View File

@@ -423,7 +423,8 @@ func loadConfig(c *conf.ConfigFile) (*CGRConfig, error) {
cfg.CdreDefaultInstance = xmlTemplates[exportTemplate[len(utils.XML_PROFILE_PREFIX):]].AsCdreConfig()
}
} else { // Not loading out of template
if flds, err := NewCdreCdrFieldsFromIds(strings.Split(exportTemplate, string(utils.CSV_SEP))...); err != nil {
if flds, err := NewCdreCdrFieldsFromIds(cfg.CdreDefaultInstance.CdrFormat == utils.CDRE_FIXED_WIDTH,
strings.Split(exportTemplate, string(utils.CSV_SEP))...); err != nil {
return nil, err
} else {
cfg.CdreDefaultInstance.ContentFields = flds

View File

@@ -214,7 +214,7 @@ func TestConfigFromFile(t *testing.T) {
MaskDestId: "test",
MaskLength: 99,
ExportDir: "test"}
eCfg.CdreDefaultInstance.ContentFields, _ = NewCdreCdrFieldsFromIds("test")
eCfg.CdreDefaultInstance.ContentFields, _ = NewCdreCdrFieldsFromIds(false, "test")
eCfg.CdrcEnabled = true
eCfg.CdrcCdrs = "test"
eCfg.CdrcRunDelay = time.Duration(99) * time.Second
@@ -264,13 +264,7 @@ func TestConfigFromFile(t *testing.T) {
eCfg.MailerFromAddr = "test"
if !reflect.DeepEqual(cfg, eCfg) {
t.Log(eCfg)
for _, eDC := range eCfg.DerivedChargers {
fmt.Printf("ExpectDerivedChargers: %+v\n", eDC)
}
t.Log(cfg)
for _, eDC := range cfg.DerivedChargers {
fmt.Printf("DerivedChargers: %+v\n", eDC)
}
t.Error("Loading of configuration from file failed!")
}
}
@@ -308,11 +302,11 @@ cdr_format = csv
export_template = cgrid,mediation_runid,accid
`)
expectedFlds := []*CdreCdrField{
&CdreCdrField{Name: "cgrid", Type: utils.CDRFIELD, Value: "cgrid", valueAsRsrField: &utils.RSRField{Id: "cgrid"}, Width: 40, Mandatory: true},
&CdreCdrField{Name: "cgrid", Type: utils.CDRFIELD, Value: "cgrid", valueAsRsrField: &utils.RSRField{Id: "cgrid"}, Mandatory: true},
&CdreCdrField{Name: "mediation_runid", Type: utils.CDRFIELD, Value: "mediation_runid", valueAsRsrField: &utils.RSRField{Id: "mediation_runid"},
Width: 20, Strip: "xright", Padding: "left", Mandatory: true},
Mandatory: true},
&CdreCdrField{Name: "accid", Type: utils.CDRFIELD, Value: "accid", valueAsRsrField: &utils.RSRField{Id: "accid"},
Width: 36, Strip: "left", Padding: "left", Mandatory: true},
Mandatory: true},
}
expCdreCfg := &CdreConfig{CdrFormat: utils.CSV, CostRoundingDecimals: -1, ExportDir: "/var/log/cgrates/cdre", ContentFields: expectedFlds}
if cfg, err := NewCGRConfigFromBytes(eFieldsCfg); err != nil {
@@ -326,9 +320,9 @@ export_template = cgrid,~effective_caller_id_number:s/(\d+)/+$1/
`)
rsrField, _ := utils.NewRSRField(`~effective_caller_id_number:s/(\d+)/+$1/`)
expectedFlds = []*CdreCdrField{
&CdreCdrField{Name: "cgrid", Type: utils.CDRFIELD, Value: "cgrid", valueAsRsrField: &utils.RSRField{Id: "cgrid"}, Width: 40, Mandatory: true},
&CdreCdrField{Name: `~effective_caller_id_number:s/(\d+)/+$1/`, Type: utils.CDRFIELD, Value: `~effective_caller_id_number:s/(\d+)/+$1/`, valueAsRsrField: rsrField,
Width: 30, Strip: "xright", Padding: "left", Mandatory: false}}
&CdreCdrField{Name: "cgrid", Type: utils.CDRFIELD, Value: "cgrid", valueAsRsrField: &utils.RSRField{Id: "cgrid"}, Mandatory: true},
&CdreCdrField{Name: `~effective_caller_id_number:s/(\d+)/+$1/`, Type: utils.CDRFIELD, Value: `~effective_caller_id_number:s/(\d+)/+$1/`,
valueAsRsrField: rsrField, Mandatory: false}}
expCdreCfg.ContentFields = expectedFlds
if cfg, err := NewCGRConfigFromBytes(eFieldsCfg); err != nil {
t.Error("Could not parse the config", err.Error())