From fded831fad3c2850515982dfbb1602c697abe17c Mon Sep 17 00:00:00 2001 From: DanB Date: Wed, 26 Mar 2014 10:26:32 +0100 Subject: [PATCH] Bug fixup on loading extra fields configuration, better config testing --- apier/apier_local_test.go | 2 +- apier/tutfscsv_local_test.go | 2 +- apier/tutfsjson_local_test.go | 2 +- cdrc/cdrc_local_test.go | 4 +- cmd/cgr-engine/cgr-engine.go | 2 +- config/config.go | 138 ++++++++++++++++---------------- config/config_local_test.go | 2 +- config/config_test.go | 51 +++++++++++- mediator/mediator_local_test.go | 2 +- 9 files changed, 126 insertions(+), 79 deletions(-) diff --git a/apier/apier_local_test.go b/apier/apier_local_test.go index 6a2db505a..90762f4b9 100644 --- a/apier/apier_local_test.go +++ b/apier/apier_local_test.go @@ -66,7 +66,7 @@ var waitRater = flag.Int("wait_rater", 500, "Number of miliseconds to wait for r func init() { cfgPath = path.Join(*dataDir, "conf", "samples", "apier_local_test.cfg") - cfg, _ = config.NewCGRConfig(&cfgPath) + cfg, _ = config.NewCGRConfigFromFile(&cfgPath) } func TestCreateDirs(t *testing.T) { diff --git a/apier/tutfscsv_local_test.go b/apier/tutfscsv_local_test.go index d9264d144..a3b066b5a 100644 --- a/apier/tutfscsv_local_test.go +++ b/apier/tutfscsv_local_test.go @@ -38,7 +38,7 @@ var fscsvCfg *config.CGRConfig func init() { fscsvCfgPath = path.Join(*dataDir, "tutorials", "fs_csv", "cgrates", "etc", "cgrates", "cgrates.cfg") - fscsvCfg, _ = config.NewCGRConfig(&fscsvCfgPath) + fscsvCfg, _ = config.NewCGRConfigFromFile(&fscsvCfgPath) } // Remove here so they can be properly created by init script diff --git a/apier/tutfsjson_local_test.go b/apier/tutfsjson_local_test.go index c3e3992c7..099de9b75 100644 --- a/apier/tutfsjson_local_test.go +++ b/apier/tutfsjson_local_test.go @@ -41,7 +41,7 @@ var waitFs = flag.Int("wait_fs", 500, "Number of miliseconds to wait for FreeSWI func init() { fsjsonCfgPath = path.Join(*dataDir, "tutorials", "fs_json", "cgrates", "etc", "cgrates", "cgrates.cfg") - fsjsonCfg, _ = config.NewCGRConfig(&fsjsonCfgPath) + fsjsonCfg, _ = config.NewCGRConfigFromFile(&fsjsonCfgPath) } // Remove here so they can be properly created by init script diff --git a/cdrc/cdrc_local_test.go b/cdrc/cdrc_local_test.go index f5c6c82a7..c3051e642 100644 --- a/cdrc/cdrc_local_test.go +++ b/cdrc/cdrc_local_test.go @@ -26,8 +26,8 @@ import ( "github.com/cgrates/cgrates/engine" "github.com/cgrates/cgrates/utils" "io/ioutil" - "os/exec" "os" + "os/exec" "path" "testing" "time" @@ -56,7 +56,7 @@ var waitRater = flag.Int("wait_rater", 300, "Number of miliseconds to wait for r func init() { cfgPath = path.Join(*dataDir, "conf", "samples", "apier_local_test.cfg") - cfg, _ = config.NewCGRConfig(&cfgPath) + cfg, _ = config.NewCGRConfigFromFile(&cfgPath) } var fileContent1 = `accid11,prepaid,out,cgrates.org,call,1001,1001,+4986517174963,2013-02-03 19:54:00,62,supplier1,172.16.1.1 diff --git a/cmd/cgr-engine/cgr-engine.go b/cmd/cgr-engine/cgr-engine.go index 2f74c6c68..36506310d 100644 --- a/cmd/cgr-engine/cgr-engine.go +++ b/cmd/cgr-engine/cgr-engine.go @@ -289,7 +289,7 @@ func main() { } runtime.GOMAXPROCS(runtime.NumCPU()) - cfg, err = config.NewCGRConfig(cfgPath) + cfg, err = config.NewCGRConfigFromFile(cfgPath) if err != nil { engine.Logger.Crit(fmt.Sprintf("Could not parse config: %s exiting!", err)) return diff --git a/config/config.go b/config/config.go index ddfa8c395..23a099eb3 100644 --- a/config/config.go +++ b/config/config.go @@ -328,12 +328,8 @@ func NewDefaultCGRConfig() (*CGRConfig, error) { return cfg, nil } -// Instantiate a new CGRConfig setting defaults or reading from file -func NewCGRConfig(cfgPath *string) (*CGRConfig, error) { - c, err := conf.ReadConfigFile(*cfgPath) - if err != nil { - return nil, errors.New(fmt.Sprintf("Could not open the configuration file: %s", err)) - } +// Unifies the config handling for both tests and real path +func NewCGRConfig(c *conf.ConfigFile) (*CGRConfig, error) { cfg, err := loadConfig(c) if err != nil { return nil, err @@ -344,26 +340,28 @@ func NewCGRConfig(cfgPath *string) (*CGRConfig, error) { return cfg, nil } -func NewCGRConfigBytes(data []byte) (*CGRConfig, error) { +// Instantiate a new CGRConfig setting defaults or reading from file +func NewCGRConfigFromFile(cfgPath *string) (*CGRConfig, error) { + c, err := conf.ReadConfigFile(*cfgPath) + if err != nil { + return nil, errors.New(fmt.Sprintf("Could not open the configuration file: %s", err)) + } + return NewCGRConfig(c) +} + +func NewCGRConfigFromBytes(data []byte) (*CGRConfig, error) { c, err := conf.ReadConfigBytes(data) if err != nil { return nil, errors.New(fmt.Sprintf("Could not open the configuration file: %s", err)) } - cfg, err := loadConfig(c) - if err != nil { - return nil, err - } - if err := cfg.checkConfigSanity(); err != nil { - return nil, err - } - return cfg, nil + return NewCGRConfig(c) } func loadConfig(c *conf.ConfigFile) (*CGRConfig, error) { cfg := &CGRConfig{} cfg.setDefaults() var hasOpt bool - var errParse error + var err error if hasOpt = c.HasOption("global", "ratingdb_type"); hasOpt { cfg.RatingDBType, _ = c.GetString("global", "ratingdb_type") } @@ -479,7 +477,7 @@ func loadConfig(c *conf.ConfigFile) (*CGRConfig, error) { if hasOpt = c.HasOption("cdrs", "extra_fields"); hasOpt { extraFieldsStr, _ := c.GetString("cdrs", "extra_fields") if extraFields, err := ParseRSRFields(extraFieldsStr); err != nil { - return nil, errParse + return nil, err } else { cfg.CDRSExtraFields = extraFields } @@ -494,7 +492,7 @@ func loadConfig(c *conf.ConfigFile) (*CGRConfig, error) { exportTemplate, _ := c.GetString("cdre", "export_template") if cfg.CdreCdrFormat != utils.CDRE_FIXED_WIDTH { // Csv most likely if extraFields, err := ParseRSRFields(exportTemplate); err != nil { - return nil, errParse + return nil, err } else { cfg.CdreExportedFields = extraFields } @@ -520,8 +518,8 @@ func loadConfig(c *conf.ConfigFile) (*CGRConfig, error) { } if hasOpt = c.HasOption("cdrc", "run_delay"); hasOpt { durStr, _ := c.GetString("cdrc", "run_delay") - if cfg.CdrcRunDelay, errParse = utils.ParseDurationWithSecs(durStr); errParse != nil { - return nil, errParse + if cfg.CdrcRunDelay, err = utils.ParseDurationWithSecs(durStr); err != nil { + return nil, err } } if hasOpt = c.HasOption("cdrc", "cdr_type"); hasOpt { @@ -570,8 +568,8 @@ func loadConfig(c *conf.ConfigFile) (*CGRConfig, error) { cfg.CdrcDurationField, _ = c.GetString("cdrc", "duration_field") } if hasOpt = c.HasOption("cdrc", "extra_fields"); hasOpt { - if cfg.CdrcExtraFields, errParse = ConfigSlice(c, "cdrc", "extra_fields"); errParse != nil { - return nil, errParse + if cfg.CdrcExtraFields, err = ConfigSlice(c, "cdrc", "extra_fields"); err != nil { + return nil, err } } if hasOpt = c.HasOption("mediator", "enabled"); hasOpt { @@ -584,58 +582,58 @@ func loadConfig(c *conf.ConfigFile) (*CGRConfig, error) { cfg.MediatorRaterReconnects, _ = c.GetInt("mediator", "rater_reconnects") } if hasOpt = c.HasOption("mediator", "run_ids"); hasOpt { - if cfg.MediatorRunIds, errParse = ConfigSlice(c, "mediator", "run_ids"); errParse != nil { - return nil, errParse + if cfg.MediatorRunIds, err = ConfigSlice(c, "mediator", "run_ids"); err != nil { + return nil, err } } if hasOpt = c.HasOption("mediator", "subject_fields"); hasOpt { - if cfg.MediatorSubjectFields, errParse = ConfigSlice(c, "mediator", "subject_fields"); errParse != nil { - return nil, errParse + if cfg.MediatorSubjectFields, err = ConfigSlice(c, "mediator", "subject_fields"); err != nil { + return nil, err } } if hasOpt = c.HasOption("mediator", "reqtype_fields"); hasOpt { - if cfg.MediatorReqTypeFields, errParse = ConfigSlice(c, "mediator", "reqtype_fields"); errParse != nil { - return nil, errParse + if cfg.MediatorReqTypeFields, err = ConfigSlice(c, "mediator", "reqtype_fields"); err != nil { + return nil, err } } if hasOpt = c.HasOption("mediator", "direction_fields"); hasOpt { - if cfg.MediatorDirectionFields, errParse = ConfigSlice(c, "mediator", "direction_fields"); errParse != nil { - return nil, errParse + if cfg.MediatorDirectionFields, err = ConfigSlice(c, "mediator", "direction_fields"); err != nil { + return nil, err } } if hasOpt = c.HasOption("mediator", "tenant_fields"); hasOpt { - if cfg.MediatorTenantFields, errParse = ConfigSlice(c, "mediator", "tenant_fields"); errParse != nil { - return nil, errParse + if cfg.MediatorTenantFields, err = ConfigSlice(c, "mediator", "tenant_fields"); err != nil { + return nil, err } } if hasOpt = c.HasOption("mediator", "tor_fields"); hasOpt { - if cfg.MediatorTORFields, errParse = ConfigSlice(c, "mediator", "tor_fields"); errParse != nil { - return nil, errParse + if cfg.MediatorTORFields, err = ConfigSlice(c, "mediator", "tor_fields"); err != nil { + return nil, err } } if hasOpt = c.HasOption("mediator", "account_fields"); hasOpt { - if cfg.MediatorAccountFields, errParse = ConfigSlice(c, "mediator", "account_fields"); errParse != nil { - return nil, errParse + if cfg.MediatorAccountFields, err = ConfigSlice(c, "mediator", "account_fields"); err != nil { + return nil, err } } if hasOpt = c.HasOption("mediator", "destination_fields"); hasOpt { - if cfg.MediatorDestFields, errParse = ConfigSlice(c, "mediator", "destination_fields"); errParse != nil { - return nil, errParse + if cfg.MediatorDestFields, err = ConfigSlice(c, "mediator", "destination_fields"); err != nil { + return nil, err } } if hasOpt = c.HasOption("mediator", "setup_time_fields"); hasOpt { - if cfg.MediatorSetupTimeFields, errParse = ConfigSlice(c, "mediator", "setup_time_fields"); errParse != nil { - return nil, errParse + if cfg.MediatorSetupTimeFields, err = ConfigSlice(c, "mediator", "setup_time_fields"); err != nil { + return nil, err } } if hasOpt = c.HasOption("mediator", "answer_time_fields"); hasOpt { - if cfg.MediatorAnswerTimeFields, errParse = ConfigSlice(c, "mediator", "answer_time_fields"); errParse != nil { - return nil, errParse + if cfg.MediatorAnswerTimeFields, err = ConfigSlice(c, "mediator", "answer_time_fields"); err != nil { + return nil, err } } if hasOpt = c.HasOption("mediator", "duration_fields"); hasOpt { - if cfg.MediatorDurationFields, errParse = ConfigSlice(c, "mediator", "duration_fields"); errParse != nil { - return nil, errParse + if cfg.MediatorDurationFields, err = ConfigSlice(c, "mediator", "duration_fields"); err != nil { + return nil, err } } if hasOpt = c.HasOption("session_manager", "enabled"); hasOpt { @@ -655,63 +653,63 @@ func loadConfig(c *conf.ConfigFile) (*CGRConfig, error) { } if hasOpt = c.HasOption("session_manager", "max_call_duration"); hasOpt { maxCallDurStr, _ := c.GetString("session_manager", "max_call_duration") - if cfg.SMMaxCallDuration, errParse = utils.ParseDurationWithSecs(maxCallDurStr); errParse != nil { - return nil, errParse + if cfg.SMMaxCallDuration, err = utils.ParseDurationWithSecs(maxCallDurStr); err != nil { + return nil, err } } if hasOpt = c.HasOption("session_manager", "run_ids"); hasOpt { - if cfg.SMRunIds, errParse = ConfigSlice(c, "session_manager", "run_ids"); errParse != nil { - return nil, errParse + if cfg.SMRunIds, err = ConfigSlice(c, "session_manager", "run_ids"); err != nil { + return nil, err } } if hasOpt = c.HasOption("session_manager", "reqtype_fields"); hasOpt { - if cfg.SMReqTypeFields, errParse = ConfigSlice(c, "session_manager", "reqtype_fields"); errParse != nil { - return nil, errParse + if cfg.SMReqTypeFields, err = ConfigSlice(c, "session_manager", "reqtype_fields"); err != nil { + return nil, err } } if hasOpt = c.HasOption("session_manager", "direction_fields"); hasOpt { - if cfg.SMDirectionFields, errParse = ConfigSlice(c, "session_manager", "direction_fields"); errParse != nil { - return nil, errParse + if cfg.SMDirectionFields, err = ConfigSlice(c, "session_manager", "direction_fields"); err != nil { + return nil, err } } if hasOpt = c.HasOption("session_manager", "tenant_fields"); hasOpt { - if cfg.SMTenantFields, errParse = ConfigSlice(c, "session_manager", "tenant_fields"); errParse != nil { - return nil, errParse + if cfg.SMTenantFields, err = ConfigSlice(c, "session_manager", "tenant_fields"); err != nil { + return nil, err } } if hasOpt = c.HasOption("session_manager", "tor_fields"); hasOpt { - if cfg.SMTORFields, errParse = ConfigSlice(c, "session_manager", "tor_fields"); errParse != nil { - return nil, errParse + if cfg.SMTORFields, err = ConfigSlice(c, "session_manager", "tor_fields"); err != nil { + return nil, err } } if hasOpt = c.HasOption("session_manager", "account_fields"); hasOpt { - if cfg.SMAccountFields, errParse = ConfigSlice(c, "session_manager", "account_fields"); errParse != nil { - return nil, errParse + if cfg.SMAccountFields, err = ConfigSlice(c, "session_manager", "account_fields"); err != nil { + return nil, err } } if hasOpt = c.HasOption("session_manager", "subject_fields"); hasOpt { - if cfg.SMSubjectFields, errParse = ConfigSlice(c, "session_manager", "subject_fields"); errParse != nil { - return nil, errParse + if cfg.SMSubjectFields, err = ConfigSlice(c, "session_manager", "subject_fields"); err != nil { + return nil, err } } if hasOpt = c.HasOption("session_manager", "destination_fields"); hasOpt { - if cfg.SMDestFields, errParse = ConfigSlice(c, "session_manager", "destination_fields"); errParse != nil { - return nil, errParse + if cfg.SMDestFields, err = ConfigSlice(c, "session_manager", "destination_fields"); err != nil { + return nil, err } } if hasOpt = c.HasOption("session_manager", "setup_time_fields"); hasOpt { - if cfg.SMSetupTimeFields, errParse = ConfigSlice(c, "session_manager", "setup_time_fields"); errParse != nil { - return nil, errParse + if cfg.SMSetupTimeFields, err = ConfigSlice(c, "session_manager", "setup_time_fields"); err != nil { + return nil, err } } if hasOpt = c.HasOption("session_manager", "answer_time_fields"); hasOpt { - if cfg.SMAnswerTimeFields, errParse = ConfigSlice(c, "session_manager", "answer_time_fields"); errParse != nil { - return nil, errParse + if cfg.SMAnswerTimeFields, err = ConfigSlice(c, "session_manager", "answer_time_fields"); err != nil { + return nil, err } } if hasOpt = c.HasOption("session_manager", "duration_fields"); hasOpt { - if cfg.SMDurationFields, errParse = ConfigSlice(c, "session_manager", "duration_fields"); errParse != nil { - return nil, errParse + if cfg.SMDurationFields, err = ConfigSlice(c, "session_manager", "duration_fields"); err != nil { + return nil, err } } if hasOpt = c.HasOption("freeswitch", "server"); hasOpt { @@ -737,8 +735,8 @@ func loadConfig(c *conf.ConfigFile) (*CGRConfig, error) { } if hasOpt = c.HasOption("history_server", "save_interval"); hasOpt { saveIntvlStr, _ := c.GetString("history_server", "save_interval") - if cfg.HistorySaveInterval, errParse = utils.ParseDurationWithSecs(saveIntvlStr); errParse != nil { - return nil, errParse + if cfg.HistorySaveInterval, err = utils.ParseDurationWithSecs(saveIntvlStr); err != nil { + return nil, err } } if hasOpt = c.HasOption("mailer", "server"); hasOpt { diff --git a/config/config_local_test.go b/config/config_local_test.go index eac978f11..23e6090a8 100644 --- a/config/config_local_test.go +++ b/config/config_local_test.go @@ -32,7 +32,7 @@ func TestLoadXmlCfg(t *testing.T) { return } cfgPath := path.Join(*dataDir, "conf", "samples", "config_local_test.cfg") - cfg, err := NewCGRConfig(&cfgPath) + cfg, err := NewCGRConfigFromFile(&cfgPath) if err != nil { t.Error(err) } diff --git a/config/config_test.go b/config/config_test.go index e9b83c4c9..7d23230c9 100644 --- a/config/config_test.go +++ b/config/config_test.go @@ -193,7 +193,7 @@ func TestSanityCheck(t *testing.T) { // Load config from file and make sure we have all set func TestConfigFromFile(t *testing.T) { cfgPth := "test_data.txt" - cfg, err := NewCGRConfig(&cfgPth) + cfg, err := NewCGRConfigFromFile(&cfgPth) if err != nil { t.Log(fmt.Sprintf("Could not parse config: %s!", err)) t.FailNow() @@ -307,3 +307,52 @@ func TestConfigFromFile(t *testing.T) { t.Error("Loading of configuration from file failed!") } } + +func TestCdrsExtraFields(t *testing.T) { + eFieldsCfg := []byte(`[cdrs] +extra_fields = extr1,extr2 +`) + if cfg, err := NewCGRConfigFromBytes(eFieldsCfg); err != nil { + t.Error("Could not parse the config", err.Error()) + } else if !reflect.DeepEqual(cfg.CDRSExtraFields, []*utils.RSRField{&utils.RSRField{Id: "extr1"}, &utils.RSRField{Id: "extr2"}}) { + t.Errorf("Unexpected value for CdrsExtraFields: %v", cfg.CDRSExtraFields) + } + eFieldsCfg = []byte(`[cdrs] +extra_fields = extr1,extr2, +`) + if _, err := NewCGRConfigFromBytes(eFieldsCfg); err == nil { + t.Error("Failed to detect empty field in the end of extra fields defition") + } + eFieldsCfg = []byte(`[cdrs] +extra_fields = extr1,~extr2:s/x.+/ +`) + if _, err := NewCGRConfigFromBytes(eFieldsCfg); err == nil { + t.Error("Failed to detect failed RSRParsing") + } +} + +func TestCdreExtraFields(t *testing.T) { + eFieldsCfg := []byte(`[cdre] +cdr_format = csv +export_template = cgrid,mediation_runid,accid +`) + if cfg, err := NewCGRConfigFromBytes(eFieldsCfg); err != nil { + t.Error("Could not parse the config", err.Error()) + } else if !reflect.DeepEqual(cfg.CdreExportedFields, []*utils.RSRField{&utils.RSRField{Id: "cgrid"}, &utils.RSRField{Id: "mediation_runid"}, &utils.RSRField{Id: "accid"}}) { + t.Errorf("Unexpected value for CdrsExtraFields: %v", cfg.CDRSExtraFields) + } + eFieldsCfg = []byte(`[cdre] +cdr_format = csv +export_template = cgrid,mediation_runid,accid, +`) + if _, err := NewCGRConfigFromBytes(eFieldsCfg); err == nil { + t.Error("Failed to detect empty field in the end of export_template defition") + } + eFieldsCfg = []byte(`[cdre] +cdr_format = csv +export_template = cgrid,~accid:s/(\d)/$1,runid +`) + if _, err := NewCGRConfigFromBytes(eFieldsCfg); err == nil { + t.Error("Failed to detect failed RSRParsing") + } +} diff --git a/mediator/mediator_local_test.go b/mediator/mediator_local_test.go index b2616986b..88d3c2c52 100644 --- a/mediator/mediator_local_test.go +++ b/mediator/mediator_local_test.go @@ -59,7 +59,7 @@ var startDelay = flag.Int("delay_start", 300, "Number of miliseconds to it for r var cfgPath = path.Join(*dataDir, "conf", "samples", "mediator_test1.cfg") func init() { - cfg, _ = config.NewCGRConfig(&cfgPath) + cfg, _ = config.NewCGRConfigFromFile(&cfgPath) } func TestInitRatingDb(t *testing.T) {