diff --git a/apier/apier_local_test.go b/apier/apier_local_test.go index fe66ce686..a93d45aa6 100644 --- a/apier/apier_local_test.go +++ b/apier/apier_local_test.go @@ -473,7 +473,7 @@ func TestApierTPRatingProfile(t *testing.T) { // Check missing params if err := rater.Call("ApierV1.SetTPRatingProfile", new(utils.TPRatingProfile), &reply); err == nil { t.Error("Calling ApierV1.SetTPRatingProfile, expected error, received: ", reply) - } else if err.Error() != "MANDATORY_IE_MISSING:[TPid LoadId Tenant TOR Direction Subject RatingPlanActivations]" { + } else if err.Error() != "MANDATORY_IE_MISSING:[TPid LoadId Tenant Category Direction Subject RatingPlanActivations]" { t.Error("Calling ApierV1.SetTPRatingProfile got unexpected error: ", err.Error()) } // Test get diff --git a/apier/tpratingprofiles.go b/apier/tpratingprofiles.go index cf5e74a5f..120cd32f2 100644 --- a/apier/tpratingprofiles.go +++ b/apier/tpratingprofiles.go @@ -29,7 +29,7 @@ import ( // Creates a new RatingProfile within a tariff plan func (self *ApierV1) SetTPRatingProfile(attrs utils.TPRatingProfile, reply *string) error { - if missing := utils.MissingStructFields(&attrs, []string{"TPid", "LoadId", "Tenant", "TOR", "Direction", "Subject", "RatingPlanActivations"}); len(missing) != 0 { + if missing := utils.MissingStructFields(&attrs, []string{"TPid", "LoadId", "Tenant", "Category", "Direction", "Subject", "RatingPlanActivations"}); len(missing) != 0 { return fmt.Errorf("%s:%v", utils.ERR_MANDATORY_IE_MISSING, missing) } if err := self.StorDb.SetTPRatingProfiles(attrs.TPid, map[string]*utils.TPRatingProfile{attrs.KeyId(): &attrs}); err != nil { diff --git a/data/conf/samples/mediator_test1.cfg b/data/conf/samples/mediator_test1.cfg index a15950aea..a5549492f 100644 --- a/data/conf/samples/mediator_test1.cfg +++ b/data/conf/samples/mediator_test1.cfg @@ -22,7 +22,7 @@ run_ids = run2 # Identifiers of additional sessions control. reqtype_fields = *default # Name of request type fields to be used during additional sessions control <""|*default|field_name>. direction_fields = *default # Name of direction fields to be used during additional sessions control <""|*default|field_name>. tenant_fields = *default # Name of tenant fields to be used during additional sessions control <""|*default|field_name>. -tor_fields = *default # Name of tor fields to be used during additional sessions control <""|*default|field_name>. +category_fields = *default # Name of tor fields to be used during additional sessions control <""|*default|field_name>. account_fields = ^dc2 # Name of account fields to be used during additional sessions control <""|*default|field_name>. subject_fields = ^dc2 # Name of fields to be used during additional sessions control <""|*default|field_name>. destination_fields = *default # Name of destination fields to be used during additional sessions control <""|*default|field_name>. @@ -32,3 +32,4 @@ duration_fields = *default # Name of duration fields to be used during addition # combined_chargers = true # Combine accounts specific derived_chargers with server configured ones . + diff --git a/data/tutorials/fs_csv/cgrates/tariffplans/ActionTriggers.csv b/data/tutorials/fs_csv/cgrates/tariffplans/ActionTriggers.csv index 2f7729eec..d222d7ef8 100644 --- a/data/tutorials/fs_csv/cgrates/tariffplans/ActionTriggers.csv +++ b/data/tutorials/fs_csv/cgrates/tariffplans/ActionTriggers.csv @@ -1,4 +1,4 @@ -#Tag,BalanceType,Direction,ThresholdType,ThresholdValue,DestinationTag,ActionsTag,Weight -STANDARD_TRIGGERS,*monetary,*out,*min_balance,2,,LOG_WARNING,10 -STANDARD_TRIGGERS,*monetary,*out,*max_balance,20,,LOG_WARNING,10 -STANDARD_TRIGGERS,*monetary,*out,*max_counter,5,FS_USERS,LOG_WARNING,10 +#Tag,BalanceType,Direction,ThresholdType,ThresholdValue,Recurrent,DestinationTag,ActionsTag,Weight +STANDARD_TRIGGERS,*monetary,*out,*min_balance,2,false,,LOG_WARNING,10 +STANDARD_TRIGGERS,*monetary,*out,*max_balance,20,false,,LOG_WARNING,10 +STANDARD_TRIGGERS,*monetary,*out,*max_counter,5,false,FS_USERS,LOG_WARNING,10 diff --git a/data/tutorials/fs_csv/cgrates/tariffplans/RatingProfiles.csv b/data/tutorials/fs_csv/cgrates/tariffplans/RatingProfiles.csv index dae7a6391..0a2875f19 100644 --- a/data/tutorials/fs_csv/cgrates/tariffplans/RatingProfiles.csv +++ b/data/tutorials/fs_csv/cgrates/tariffplans/RatingProfiles.csv @@ -1,2 +1,2 @@ -#Tenant,TOR,Direction,Subject,ActivationTime,RatingPlanTag,FallbackSubject -cgrates.org,call,*out,*any,2013-01-06T00:00:00Z,RP_RETAIL, +#Direction,Tenant,Category,Subject,ActivationTime,RatingPlanId,RatesFallbackSubject +*out,cgrates.org,call,*any,2013-01-06T00:00:00Z,RP_RETAIL, diff --git a/data/tutorials/fs_json/cgrates/tariffplans/ActionTriggers.csv b/data/tutorials/fs_json/cgrates/tariffplans/ActionTriggers.csv index 2f7729eec..e35423b69 100644 --- a/data/tutorials/fs_json/cgrates/tariffplans/ActionTriggers.csv +++ b/data/tutorials/fs_json/cgrates/tariffplans/ActionTriggers.csv @@ -1,4 +1,4 @@ -#Tag,BalanceType,Direction,ThresholdType,ThresholdValue,DestinationTag,ActionsTag,Weight -STANDARD_TRIGGERS,*monetary,*out,*min_balance,2,,LOG_WARNING,10 -STANDARD_TRIGGERS,*monetary,*out,*max_balance,20,,LOG_WARNING,10 -STANDARD_TRIGGERS,*monetary,*out,*max_counter,5,FS_USERS,LOG_WARNING,10 +#Tag,BalanceType,Direction,ThresholdType,ThresholdValue,Recurrent,DestinationTag,ActionsTag,Weight +STANDARD_TRIGGERS,*monetary,*out,*min_balance,2,false,,LOG_WARNING,10 +STANDARD_TRIGGERS,*monetary,*out,*max_balance,20,false,,LOG_WARNING,10 +STANDARD_TRIGGERS,*monetary,*out,*max_counter,5,false,FS_USERS,LOG_WARNING,10 \ No newline at end of file diff --git a/data/tutorials/fs_json/cgrates/tariffplans/RatingProfiles.csv b/data/tutorials/fs_json/cgrates/tariffplans/RatingProfiles.csv index 09344c636..ad0062c82 100644 --- a/data/tutorials/fs_json/cgrates/tariffplans/RatingProfiles.csv +++ b/data/tutorials/fs_json/cgrates/tariffplans/RatingProfiles.csv @@ -1,3 +1,3 @@ -#Tenant,TOR,Direction,Subject,ActivationTime,RatingPlanTag,FallbackSubject -cgrates.org,call,*out,*any,2014-01-14T00:00:00Z,RP_RETAIL1, -cgrates.org,call,*out,1001;1006,2014-01-14T00:00:00Z,RP_RETAIL2, +#Direction,Tenant,Category,Subject,ActivationTime,RatingPlanId,RatesFallbackSubject +*out,cgrates.org,call,*any,2014-01-14T00:00:00Z,RP_RETAIL1, +*out,cgrates.org,call,1001;1006,2014-01-14T00:00:00Z,RP_RETAIL2, diff --git a/engine/storage_sql.go b/engine/storage_sql.go index 019673a49..a42d183b2 100644 --- a/engine/storage_sql.go +++ b/engine/storage_sql.go @@ -545,7 +545,7 @@ func (self *SQLStorage) LogActionTiming(source string, at *ActionTiming, as Acti func (self *SQLStorage) LogError(uuid, source, runid, errstr string) (err error) { return } func (self *SQLStorage) SetCdr(cdr *utils.StoredCdr) (err error) { - _, err = self.Db.Exec(fmt.Sprintf("INSERT INTO %s VALUES (NULL,'%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s', %d)", + _, err = self.Db.Exec(fmt.Sprintf("INSERT INTO %s (cgrid,accid,cdrhost,cdrsource,reqtype,direction,tenant,category,account,subject,destination,setup_time,answer_time,duration) VALUES ('%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s', %d)", utils.TBL_CDRS_PRIMARY, cdr.CgrId, cdr.AccId, @@ -569,7 +569,7 @@ func (self *SQLStorage) SetCdr(cdr *utils.StoredCdr) (err error) { if err != nil { Logger.Err(fmt.Sprintf("Error marshalling cdr extra fields to json: %v", err)) } - _, err = self.Db.Exec(fmt.Sprintf("INSERT INTO %s VALUES ('NULL','%s', '%s')", + _, err = self.Db.Exec(fmt.Sprintf("INSERT INTO %s (cgrid,extra_fields) VALUES ('%s', '%s')", utils.TBL_CDRS_EXTRA, cdr.CgrId, extraFields, diff --git a/engine/storage_sql_local_test.go b/engine/storage_sql_local_test.go index d14144e2f..25ba19540 100644 --- a/engine/storage_sql_local_test.go +++ b/engine/storage_sql_local_test.go @@ -137,21 +137,25 @@ func TestSetCdr(t *testing.T) { if !*testLocal { return } - cgrCdr1 := &utils.CgrCdr{"accid": "aaa1", "cdrhost": "192.168.1.1", "reqtype": "rated", "direction": "*out", "tenant": "cgrates.org", "tor": "call", - "account": "1001", "subject": "1001", "destination": "1002", "setup_time": "2013-11-08T08:42:20Z", "answer_time": "2013-11-08T08:42:26Z", "duration": "10s", - "field_extr1": "val_extr1", "fieldextr2": "valextr2", "cdrsource": TEST_SQL} - cgrCdr2 := &utils.CgrCdr{"accid": "aaa2", "cdrhost": "192.168.1.1", "reqtype": "prepaid", "direction": "*out", "tenant": "cgrates.org", "tor": "call", - "account": "1001", "subject": "1001", "destination": "1002", "setup_time": "2013-11-08T08:42:22Z", "answer_time": "2013-11-08T08:42:26Z", "duration": "20", - "field_extr1": "val_extr1", "fieldextr2": "valextr2", "cdrsource": TEST_SQL} - cgrCdr3 := &utils.CgrCdr{"accid": "aaa3", "cdrhost": "192.168.1.1", "reqtype": "rated", "direction": "*out", "tenant": "cgrates.org", "tor": "premium_call", - "account": "1002", "subject": "1002", "destination": "1001", "setup_time": "2013-11-07T08:42:24Z", "answer_time": "2013-11-07T08:42:26Z", "duration": "60s", - "field_extr1": "val_extr1", "fieldextr2": "valextr2", "cdrsource": TEST_SQL} - cgrCdr4 := &utils.CgrCdr{"accid": "aaa4", "cdrhost": "192.168.1.2", "reqtype": "pseudoprepaid", "direction": "*out", "tenant": "itsyscom.com", "tor": "call", - "account": "1001", "subject": "1001", "destination": "+4986517174964", "setup_time": "2013-11-07T08:42:21Z", "answer_time": "2013-11-07T08:42:26Z", "duration": "1m2s", - "field_extr1": "val_extr1", "fieldextr2": "valextr2", "cdrsource": TEST_SQL} - cgrCdr5 := &utils.CgrCdr{"accid": "aaa5", "cdrhost": "192.168.1.2", "reqtype": "postpaid", "direction": "*out", "tenant": "itsyscom.com", "tor": "call", - "account": "1002", "subject": "1002", "destination": "+4986517174963", "setup_time": "2013-11-07T08:42:25Z", "answer_time": "2013-11-07T08:42:26Z", "duration": "15s", - "field_extr1": "val_extr1", "fieldextr2": "valextr2", "cdrsource": TEST_SQL} + cgrCdr1 := &utils.CgrCdr{utils.ACCID: "aaa1", utils.CDRHOST: "192.168.1.1", utils.REQTYPE: "rated", utils.DIRECTION: "*out", utils.TENANT: "cgrates.org", + utils.CATEGORY: "call", utils.ACCOUNT: "1001", utils.SUBJECT: "1001", utils.DESTINATION: "1002", utils.SETUP_TIME: "2013-11-08T08:42:20Z", + utils.ANSWER_TIME: "2013-11-08T08:42:26Z", utils.DURATION: "10s", "field_extr1": "val_extr1", "fieldextr2": "valextr2", utils.CDRSOURCE: TEST_SQL} + cgrCdr2 := &utils.CgrCdr{utils.ACCID: "aaa2", utils.CDRHOST: "192.168.1.1", utils.REQTYPE: "prepaid", utils.DIRECTION: "*out", utils.TENANT: "cgrates.org", + utils.CATEGORY: "call", utils.ACCOUNT: "1001", utils.SUBJECT: "1001", utils.DESTINATION: "1002", utils.SETUP_TIME: "2013-11-08T08:42:22Z", + utils.ANSWER_TIME: "2013-11-08T08:42:26Z", utils.DURATION: "20", "field_extr1": "val_extr1", "fieldextr2": "valextr2", "cdrsource": TEST_SQL} + + cgrCdr3 := &utils.CgrCdr{utils.ACCID: "aaa3", utils.CDRHOST: "192.168.1.1", utils.REQTYPE: "rated", utils.DIRECTION: "*out", utils.TENANT: "cgrates.org", + utils.CATEGORY: "premium_call", utils.ACCOUNT: "1002", utils.SUBJECT: "1002", utils.DESTINATION: "1001", utils.SETUP_TIME: "2013-11-07T08:42:24Z", + utils.ANSWER_TIME: "2013-11-07T08:42:26Z", utils.DURATION: "60s", "field_extr1": "val_extr1", "fieldextr2": "valextr2", "cdrsource": TEST_SQL} + + cgrCdr4 := &utils.CgrCdr{utils.ACCID: "aaa4", utils.CDRHOST: "192.168.1.2", utils.REQTYPE: "pseudoprepaid", utils.DIRECTION: "*out", utils.TENANT: "itsyscom.com", + utils.CATEGORY: "call", utils.ACCOUNT: "1001", utils.SUBJECT: "1001", utils.DESTINATION: "+4986517174964", utils.SETUP_TIME: "2013-11-07T08:42:21Z", + utils.ANSWER_TIME: "2013-11-07T08:42:26Z", utils.DURATION: "1m2s", "field_extr1": "val_extr1", "fieldextr2": "valextr2", "cdrsource": TEST_SQL} + + cgrCdr5 := &utils.CgrCdr{utils.ACCID: "aaa5", utils.CDRHOST: "192.168.1.2", utils.REQTYPE: "postpaid", utils.DIRECTION: "*out", utils.TENANT: "itsyscom.com", + utils.CATEGORY: "call", utils.ACCOUNT: "1002", utils.SUBJECT: "1002", utils.DESTINATION: "+4986517174963", utils.SETUP_TIME: "2013-11-07T08:42:25Z", + utils.ANSWER_TIME: "2013-11-07T08:42:26Z", utils.DURATION: "15s", "field_extr1": "val_extr1", "fieldextr2": "valextr2", "cdrsource": TEST_SQL} + for _, cdr := range []*utils.CgrCdr{cgrCdr1, cgrCdr2, cgrCdr3, cgrCdr4, cgrCdr5} { if err := mysql.SetCdr(cdr.AsStoredCdr()); err != nil { t.Error(err.Error()) diff --git a/mediator/mediator_local_test.go b/mediator/mediator_local_test.go index 0615e7b1b..36a6a74f0 100644 --- a/mediator/mediator_local_test.go +++ b/mediator/mediator_local_test.go @@ -58,14 +58,15 @@ var storDbType = flag.String("stordb_type", utils.MYSQL, "The type of the storDb var startDelay = flag.Int("delay_start", 300, "Number of miliseconds to it for rater to start and cache") var cfgPath = path.Join(*dataDir, "conf", "samples", "mediator_test1.cfg") -func init() { - cfg, _ = config.NewCGRConfigFromFile(&cfgPath) -} - func TestInitRatingDb(t *testing.T) { if !*testLocal { return } + var err error + cfg, err = config.NewCGRConfigFromFile(&cfgPath) + if err != nil { + t.Fatal("Got config error: ", err.Error()) + } ratingDb, err := engine.ConfigureRatingStorage(cfg.RatingDBType, cfg.RatingDBHost, cfg.RatingDBPort, cfg.RatingDBName, cfg.RatingDBUser, cfg.RatingDBPass, cfg.DBDataEncoding) if err != nil { t.Fatal("Cannot connect to dataDb", err) @@ -137,12 +138,13 @@ func TestPostCdrs(t *testing.T) { return } httpClient := new(http.Client) - cdrForm1 := url.Values{"accid": []string{"dsafdsaf"}, "cdrhost": []string{"192.168.1.1"}, "reqtype": []string{"rated"}, "direction": []string{"*out"}, - "tenant": []string{"cgrates.org"}, "tor": []string{"call"}, "account": []string{"1001"}, "subject": []string{"1001"}, "destination": []string{"+4986517174963"}, - "answer_time": []string{"2013-11-07T08:42:26Z"}, "duration": []string{"10"}, "field_extr1": []string{"val_extr1"}, "fieldextr2": []string{"valextr2"}} - cdrForm2 := url.Values{"accid": []string{"adsafdsaf"}, "cdrhost": []string{"192.168.1.1"}, "reqtype": []string{"rated"}, "direction": []string{"*out"}, - "tenant": []string{"itsyscom.com"}, "tor": []string{"call"}, "account": []string{"1003"}, "subject": []string{"1003"}, "destination": []string{"+4986517174964"}, - "answer_time": []string{"2013-11-07T08:42:26Z"}, "duration": []string{"10"}, "field_extr1": []string{"val_extr1"}, "fieldextr2": []string{"valextr2"}} + cdrForm1 := url.Values{utils.ACCID: []string{"dsafdsaf"}, utils.CDRHOST: []string{"192.168.1.1"}, utils.REQTYPE: []string{"rated"}, utils.DIRECTION: []string{"*out"}, + utils.TENANT: []string{"cgrates.org"}, utils.CATEGORY: []string{"call"}, utils.ACCOUNT: []string{"1001"}, utils.SUBJECT: []string{"1001"}, + utils.DESTINATION: []string{"+4986517174963"}, + utils.ANSWER_TIME: []string{"2013-11-07T08:42:26Z"}, utils.DURATION: []string{"10"}, "field_extr1": []string{"val_extr1"}, "fieldextr2": []string{"valextr2"}} + cdrForm2 := url.Values{utils.ACCID: []string{"adsafdsaf"}, utils.CDRHOST: []string{"192.168.1.1"}, utils.REQTYPE: []string{"rated"}, utils.DIRECTION: []string{"*out"}, + utils.TENANT: []string{"itsyscom.com"}, utils.CATEGORY: []string{"call"}, utils.ACCOUNT: []string{"1003"}, utils.SUBJECT: []string{"1003"}, utils.DESTINATION: []string{"+4986517174964"}, + utils.ANSWER_TIME: []string{"2013-11-07T08:42:26Z"}, utils.DURATION: []string{"10"}, "field_extr1": []string{"val_extr1"}, "fieldextr2": []string{"valextr2"}} for _, cdrForm := range []url.Values{cdrForm1, cdrForm2} { cdrForm.Set(utils.CDRSOURCE, engine.TEST_SQL) if _, err := httpClient.PostForm(fmt.Sprintf("http://%s/cgr", cfg.HTTPListen), cdrForm); err != nil { @@ -167,12 +169,12 @@ func TestInjectCdrs(t *testing.T) { if !*testLocal { return } - cgrCdr1 := utils.CgrCdr{"accid": "aaaaadsafdsaf", "cdrsource": engine.TEST_SQL, "cdrhost": "192.168.1.1", "reqtype": "rated", "direction": "*out", - "tenant": "cgrates.org", "tor": "call", "account": "dan", "subject": "dan", "destination": "+4986517174963", - "answer_time": "2013-11-07T08:42:26Z", "duration": "10"} - cgrCdr2 := utils.CgrCdr{"accid": "baaaadsafdsaf", "cdrsource": engine.TEST_SQL, "cdrhost": "192.168.1.1", "reqtype": "rated", "direction": "*out", - "tenant": "cgrates.org", "tor": "call", "account": "dan", "subject": "dan", "destination": "+4986517173964", - "answer_time": "2013-11-07T09:42:26Z", "duration": "20"} + cgrCdr1 := utils.CgrCdr{utils.ACCID: "aaaaadsafdsaf", "cdrsource": engine.TEST_SQL, utils.CDRHOST: "192.168.1.1", utils.REQTYPE: "rated", utils.DIRECTION: "*out", + utils.TENANT: "cgrates.org", utils.CATEGORY: "call", utils.ACCOUNT: "dan", utils.SUBJECT: "dan", utils.DESTINATION: "+4986517174963", + utils.ANSWER_TIME: "2013-11-07T08:42:26Z", utils.DURATION: "10"} + cgrCdr2 := utils.CgrCdr{utils.ACCID: "baaaadsafdsaf", "cdrsource": engine.TEST_SQL, utils.CDRHOST: "192.168.1.1", utils.REQTYPE: "rated", utils.DIRECTION: "*out", + utils.TENANT: "cgrates.org", utils.CATEGORY: "call", utils.ACCOUNT: "dan", utils.SUBJECT: "dan", utils.DESTINATION: "+4986517173964", + utils.ANSWER_TIME: "2013-11-07T09:42:26Z", utils.DURATION: "20"} for _, cdr := range []utils.CgrCdr{cgrCdr1, cgrCdr2} { if err := cdrStor.SetCdr(cdr.AsStoredCdr()); err != nil { t.Error(err) @@ -222,7 +224,7 @@ func TestRateCdrs(t *testing.T) { } if errRatedCdrs, err := cdrStor.GetStoredCdrs(nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, 0, 0, time.Time{}, time.Time{}, false, true); err != nil { t.Error(err) - } else if len(errRatedCdrs) != 4 { // The first 2 with errors should be still there before rerating + } else if len(errRatedCdrs) != 6 { // The first 2 with errors should be still there before rerating t.Error(fmt.Sprintf("Unexpected number of CDRs with errors: %d", len(errRatedCdrs))) } if err := cgrRpc.Call("MediatorV1.RateCdrs", utils.AttrRateCdrs{RerateErrors: true}, &reply); err != nil { @@ -232,7 +234,7 @@ func TestRateCdrs(t *testing.T) { } if errRatedCdrs, err := cdrStor.GetStoredCdrs(nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, 0, 0, time.Time{}, time.Time{}, false, true); err != nil { t.Error(err) - } else if len(errRatedCdrs) != 3 { + } else if len(errRatedCdrs) != 2 { t.Error(fmt.Sprintf("Unexpected number of CDRs with errors: %d", len(errRatedCdrs))) } }