From 33282f8a3ce569914316f8a32679829243279670 Mon Sep 17 00:00:00 2001 From: Razvan Crainea Date: Tue, 11 Aug 2015 15:23:48 +0300 Subject: [PATCH 01/15] add absolute path to SQL scripts This allows the administrator to run the scripts from any directory --- data/storage/mysql/setup_cgr_db.sh | 15 +++++++-------- data/storage/postgres/create_db_with_users.sh | 2 +- data/storage/postgres/setup_cgr_db.sh | 16 ++++++++-------- 3 files changed, 16 insertions(+), 17 deletions(-) diff --git a/data/storage/mysql/setup_cgr_db.sh b/data/storage/mysql/setup_cgr_db.sh index e15d6696b..7f01227f6 100755 --- a/data/storage/mysql/setup_cgr_db.sh +++ b/data/storage/mysql/setup_cgr_db.sh @@ -1,6 +1,5 @@ #! /usr/bin/env sh - if test $# -lt 2; then echo "" echo "setup_cgr_db.sh []" @@ -10,20 +9,20 @@ fi host=$3 if [ -z "$3" ]; then - host="localhost" + host="localhost" fi -mysql -u $1 -p$2 -h $host < create_db_with_users.sql +DIR="$(dirname "$(readlink -f "$0")")" + +mysql -u $1 -p$2 -h $host < "$DIR"/create_db_with_users.sql cu=$? -mysql -u $1 -p$2 -h $host -D cgrates < create_cdrs_tables.sql +mysql -u $1 -p$2 -h $host -D cgrates < "$DIR"/create_cdrs_tables.sql cdrt=$? -mysql -u $1 -p$2 -h $host -D cgrates < create_tariffplan_tables.sql +mysql -u $1 -p$2 -h $host -D cgrates < "$DIR"/create_tariffplan_tables.sql tpt=$? if [ $cu = 0 ] && [ $cdrt = 0 ] && [ $tpt = 0 ]; then - echo "" - echo "\t+++ CGR-DB successfully set-up! +++" - echo "" + echo -e "\n\t+++ CGR-DB successfully set-up! +++\n" exit 0 fi diff --git a/data/storage/postgres/create_db_with_users.sh b/data/storage/postgres/create_db_with_users.sh index 199b84dcf..484290ec1 100755 --- a/data/storage/postgres/create_db_with_users.sh +++ b/data/storage/postgres/create_db_with_users.sh @@ -5,5 +5,5 @@ sudo -u postgres dropdb -e cgrates sudo -u postgres dropuser -e cgrates -sudo -u postgres psql -c "CREATE USER cgrates password 'CGRateS.org';" +sudo -u postgres psql -c "CREATE USER cgrates password 'CGRateS.org';" sudo -u postgres createdb -e -O cgrates cgrates diff --git a/data/storage/postgres/setup_cgr_db.sh b/data/storage/postgres/setup_cgr_db.sh index 79018cc25..2ae4d8830 100755 --- a/data/storage/postgres/setup_cgr_db.sh +++ b/data/storage/postgres/setup_cgr_db.sh @@ -3,27 +3,27 @@ user=$1 if [ -z "$1" ]; then - user="cgrates" + user="cgrates" fi host=$2 if [ -z "$2" ]; then - host="localhost" + host="localhost" fi -./create_db_with_users.sh +DIR="$(dirname "$(readlink -f "$0")")" + +"$DIR"/create_db_with_users.sh export PGPASSWORD="CGRateS.org" -psql -U $user -h $host -d cgrates -f create_cdrs_tables.sql +psql -U $user -h $host -d cgrates -f "$DIR"/create_cdrs_tables.sql cdrt=$? -psql -U $user -h $host -d cgrates -f create_tariffplan_tables.sql +psql -U $user -h $host -d cgrates -f "$DIR"/create_tariffplan_tables.sql tpt=$? if [ $cdrt = 0 ] && [ $tpt = 0 ]; then - echo "" - echo "\t+++ CGR-DB successfully set-up! +++" - echo "" + echo -e "\n\t+++ CGR-DB successfully set-up! +++\n" exit 0 fi From 628f74daa63c0bb5679a2ee8a989f1184d3b836a Mon Sep 17 00:00:00 2001 From: Razvan Crainea Date: Wed, 1 Jun 2016 12:17:00 +0300 Subject: [PATCH 02/15] Update OpenSIPS GPG key and upgrade to latest rel Check: http://apt.opensips.org/packages.php?os=jessie --- docs/tut_opensips_installs.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/tut_opensips_installs.rst b/docs/tut_opensips_installs.rst index 2c68ad126..8892ff2ca 100644 --- a/docs/tut_opensips_installs.rst +++ b/docs/tut_opensips_installs.rst @@ -9,8 +9,8 @@ OpenSIPS_ We got OpenSIPS_ installed via following commands: :: - apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 5F2FBB7C - echo "deb http://apt.opensips.org jessie 2.1-releases" >>/etc/apt/sources.list + apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 049AD65B + echo "deb http://apt.opensips.org jessie 2.2-releases" >>/etc/apt/sources.list apt-get update apt-get install opensips opensips-json-module opensips-restclient-module From 3b1a53e16cc6cf490667bbe7b6fbd022af03f112 Mon Sep 17 00:00:00 2001 From: Razvan Crainea Date: Wed, 1 Jun 2016 13:25:47 +0300 Subject: [PATCH 03/15] update opensips script to 2.2 new accounting --- .../opensips/etc/opensips/opensips.cfg | 22 +++++-------------- 1 file changed, 6 insertions(+), 16 deletions(-) diff --git a/data/tutorials/osips_async/opensips/etc/opensips/opensips.cfg b/data/tutorials/osips_async/opensips/etc/opensips/opensips.cfg index 3733d6c60..5bfac3ee6 100644 --- a/data/tutorials/osips_async/opensips/etc/opensips/opensips.cfg +++ b/data/tutorials/osips_async/opensips/etc/opensips/opensips.cfg @@ -6,11 +6,10 @@ ####### Global Parameters ######### -#debug=3 +log_level=3 log_stderror=no log_facility=LOG_LOCAL0 -#fork=yes children=4 listen=udp:lo:5060 listen=udp:eth0:5060 @@ -18,6 +17,9 @@ listen=udp:eth1:5060 auto_aliases=no +# do not open more than 4096 file descriptors +open_files_limit=4096 + ####### Modules Section ######## #set module path @@ -91,24 +93,12 @@ modparam("db_flatstore", "single_file", 1) #### ACCounting module loadmodule "acc.so" modparam("acc", "detect_direction", 1) -#modparam("acc", "cdr_flag", "CDR") -#modparam("acc", "evi_flag", "CDR") -#modparam("acc", "evi_missed_flag", "CDR") modparam("acc", "evi_extra", "cgr_reqtype=$avp(cgr_reqtype); cgr_account=$avp(cgr_account); cgr_destination=$avp(cgr_destination); cgr_supplier=$avp(cgr_supplier); - cgr_answertime=$dlg_val(atime); + cgr_answertime=$dlg_val(atime); dialog_id=$DLG_did") -#modparam("acc", "db_url", "flatstore:/tmp") -#modparam("acc", "db_flag", "CDR") -#modparam("acc", "db_missed_flag", "CDR") -#modparam("acc", "db_table_missed_calls", "cgr_missed") -#modparam("acc", "db_extra", "cgr_reqtype=$avp(cgr_reqtype); -# cgr_account=$avp(cgr_account); -# cgr_destination=$avp(cgr_destination); -# cgr_supplier=$avp(cgr_supplier); -# dialog_id=$DLG_did") #### CfgUtils module loadmodule "cfgutils.so" @@ -138,7 +128,7 @@ startup_route { local_route { if (is_method("BYE") ) { - #setflag(CDR); + # make sure a LOCAL_DISCONNECT event is triggered on local BYEs acc_evi_request("LOCAL_DISCONNECT"); #FixMe } } From 0f380ec2bc65f74d62e54246d5e8cccf99bcda05 Mon Sep 17 00:00:00 2001 From: Razvan Crainea Date: Wed, 15 Jun 2016 17:22:40 +0300 Subject: [PATCH 04/15] add name to contributors --- CONTRIBUTORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 5a7a3d429..8359e701e 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -44,6 +44,7 @@ information, please see the [`CONTRIBUTING.md`](CONTRIBUTING.md) file. | @elfranne | Tom Braarup Cuykens | | @rbarrabe | Régis Barrabé | | @J0hnSteel | John Koce Steel | +| @razvancrainea | Răzvan Crainea | From dd94117e5d3ad60506c7a742d3a309b3deff4e08 Mon Sep 17 00:00:00 2001 From: DanB Date: Wed, 1 Jun 2016 18:42:45 +0200 Subject: [PATCH 05/15] Test fixes for multiple cdrc, CheckVersion taking now db as input, InitDataDb saving also version --- apier/v1/apier_local_test.go | 2 +- cmd/cgr-engine/cgr-engine.go | 2 +- engine/libtest.go | 1 + engine/version.go | 11 +++++++---- general_tests/multiplecdrc_local_test.go | 25 ++++++++++++------------ 5 files changed, 22 insertions(+), 19 deletions(-) diff --git a/apier/v1/apier_local_test.go b/apier/v1/apier_local_test.go index 50e71ef13..34028cfd0 100644 --- a/apier/v1/apier_local_test.go +++ b/apier/v1/apier_local_test.go @@ -1274,7 +1274,7 @@ func TestApierLoadTariffPlanFromFolder(t *testing.T) { } else if reply != "OK" { t.Error("Calling ApierV1.LoadTariffPlanFromFolder got reply: ", reply) } - time.Sleep(time.Duration(2**waitRater) * time.Millisecond) + time.Sleep(time.Duration(3**waitRater) * time.Millisecond) } func TestApierResetDataAfterLoadFromFolder(t *testing.T) { diff --git a/cmd/cgr-engine/cgr-engine.go b/cmd/cgr-engine/cgr-engine.go index 1a1af55a1..8c0f62af0 100644 --- a/cmd/cgr-engine/cgr-engine.go +++ b/cmd/cgr-engine/cgr-engine.go @@ -508,7 +508,7 @@ func main() { } defer accountDb.Close() engine.SetAccountingStorage(accountDb) - if err := engine.CheckVersion(); err != nil { + if err := engine.CheckVersion(nil); err != nil { fmt.Println(err.Error()) return } diff --git a/engine/libtest.go b/engine/libtest.go index 99877e0be..f45288566 100644 --- a/engine/libtest.go +++ b/engine/libtest.go @@ -48,6 +48,7 @@ func InitDataDb(cfg *config.CGRConfig) error { } } ratingDb.CacheRatingAll() + CheckVersion(accountDb) // Write version before starting return nil } diff --git a/engine/version.go b/engine/version.go index 08849db5c..6d69f6f6b 100644 --- a/engine/version.go +++ b/engine/version.go @@ -7,13 +7,16 @@ import ( "github.com/cgrates/cgrates/utils" ) -func CheckVersion() error { +func CheckVersion(acntDB AccountingStorage) error { // get current db version - dbVersion, err := accountingStorage.GetStructVersion() + if acntDB == nil { + acntDB = accountingStorage + } + dbVersion, err := acntDB.GetStructVersion() if err != nil { - if lhList, err := accountingStorage.GetLoadHistory(1, true); err != nil || len(lhList) == 0 { + if lhList, err := acntDB.GetLoadHistory(1, true); err != nil || len(lhList) == 0 { // no data, write version - if err := accountingStorage.SetStructVersion(CurrentVersion); err != nil { + if err := acntDB.SetStructVersion(CurrentVersion); err != nil { utils.Logger.Warning(fmt.Sprintf("Could not write current version to db: %v", err)) } } else { diff --git a/general_tests/multiplecdrc_local_test.go b/general_tests/multiplecdrc_local_test.go index 651404bda..0804282a3 100644 --- a/general_tests/multiplecdrc_local_test.go +++ b/general_tests/multiplecdrc_local_test.go @@ -77,23 +77,22 @@ func TestMCDRCLoadConfig(t *testing.T) { } } +// Remove data in both rating and accounting db +func TestMCDRCResetDataDb(t *testing.T) { + if !*testLocal { + return + } + if err := engine.InitDataDb(cfg); err != nil { + t.Fatal(err) + } +} + func TestMCDRCEmptyTables(t *testing.T) { if !*testLocal { return } - if *storDbType != utils.MYSQL { - t.Fatal("Unsupported storDbType") - } - mysql, err := engine.NewMySQLStorage(cfg.StorDBHost, cfg.StorDBPort, cfg.StorDBName, cfg.StorDBUser, cfg.StorDBPass, cfg.StorDBMaxOpenConns, cfg.StorDBMaxIdleConns) - if err != nil { - t.Fatal("Error on opening database connection: ", err) - } - if err := mysql.CreateTablesFromScript(path.Join(*dataDir, "storage", *storDbType, utils.CREATE_CDRS_TABLES_SQL)); err != nil { - t.Fatal("Error on mysql creation: ", err.Error()) - return // No point in going further - } - if _, err := mysql.Db.Query(fmt.Sprintf("SELECT 1 from %s", utils.TBL_CDRS)); err != nil { - t.Fatal(err.Error()) + if err := engine.InitStorDb(cfg); err != nil { + t.Fatal(err) } } From 437c1bd8fd6c7e43088da31aa729e3ca0a98391a Mon Sep 17 00:00:00 2001 From: DanB Date: Fri, 3 Jun 2016 16:41:58 +0200 Subject: [PATCH 06/15] SMGenericV1 methods change: GetMaxUsage->MaxUsage, GetLcrSuppliers->LCRSuppliers, SessionStart->InitiateSession, SessionUpdate->UpdateSession, SessionEnd->TerminateSession, ProcessCdr->ProcessCDR --- agents/dmtagent.go | 8 +++--- apier/v1/smgenericbirpcv1.go | 36 ++++++++++++------------ apier/v1/smgenericv1.go | 48 +++++++++++++++---------------- apier/v1/smgenericv1_it_test.go | 2 +- sessionmanager/data_it_test.go | 50 ++++++++++++++++----------------- sessionmanager/smg_it_test.go | 36 ++++++++++++------------ sessionmanager/smgeneric.go | 14 ++++----- 7 files changed, 97 insertions(+), 97 deletions(-) diff --git a/agents/dmtagent.go b/agents/dmtagent.go index cb927bbd3..c2708bd1a 100644 --- a/agents/dmtagent.go +++ b/agents/dmtagent.go @@ -130,13 +130,13 @@ func (self DiameterAgent) processCCR(ccr *CCR, reqProcessor *config.DARequestPro } else { // Find out maxUsage over APIs switch ccr.CCRequestType { case 1: - err = self.smg.Call("SMGenericV1.SessionStart", smgEv, &maxUsage) + err = self.smg.Call("SMGenericV1.InitiateSession", smgEv, &maxUsage) case 2: - err = self.smg.Call("SMGenericV1.SessionUpdate", smgEv, &maxUsage) + err = self.smg.Call("SMGenericV1.UpdateSession", smgEv, &maxUsage) case 3, 4: // Handle them together since we generate CDR for them var rpl string if ccr.CCRequestType == 3 { - err = self.smg.Call("SMGenericV1.SessionEnd", smgEv, &rpl) + err = self.smg.Call("SMGenericV1.TerminateSession", smgEv, &rpl) } else if ccr.CCRequestType == 4 { err = self.smg.Call("SMGenericV1.ChargeEvent", smgEv, &maxUsage) if maxUsage == 0 { @@ -144,7 +144,7 @@ func (self DiameterAgent) processCCR(ccr *CCR, reqProcessor *config.DARequestPro } } if self.cgrCfg.DiameterAgentCfg().CreateCDR { - if errCdr := self.smg.Call("SMGenericV1.ProcessCdr", smgEv, &rpl); errCdr != nil { + if errCdr := self.smg.Call("SMGenericV1.ProcessCDR", smgEv, &rpl); errCdr != nil { err = errCdr } } diff --git a/apier/v1/smgenericbirpcv1.go b/apier/v1/smgenericbirpcv1.go index 035d55b86..c5e5e40a5 100644 --- a/apier/v1/smgenericbirpcv1.go +++ b/apier/v1/smgenericbirpcv1.go @@ -37,18 +37,18 @@ type SMGenericBiRpcV1 struct { // Publishes methods exported by SMGenericBiRpcV1 as SMGenericV1 (so we can handle standard RPC methods via birpc socket) func (self *SMGenericBiRpcV1) Handlers() map[string]interface{} { return map[string]interface{}{ - "SMGenericV1.GetMaxUsage": self.GetMaxUsage, - "SMGenericV1.GetLcrSuppliers": self.GetLcrSuppliers, - "SMGenericV1.SessionStart": self.SessionStart, - "SMGenericV1.SessionUpdate": self.SessionUpdate, - "SMGenericV1.SessionEnd": self.SessionEnd, - "SMGenericV1.ProcessCdr": self.ProcessCdr, + "SMGenericV1.MaxUsage": self.MaxUsage, + "SMGenericV1.LCRSuppliers": self.LCRSuppliers, + "SMGenericV1.InitiateSession": self.InitiateSession, + "SMGenericV1.UpdateSession": self.UpdateSession, + "SMGenericV1.TerminateSession": self.TerminateSession, + "SMGenericV1.ProcessCDR": self.ProcessCDR, } } /// Returns MaxUsage (for calls in seconds), -1 for no limit -func (self *SMGenericBiRpcV1) GetMaxUsage(clnt *rpc2.Client, ev sessionmanager.SMGenericEvent, maxUsage *float64) error { - maxUsageDur, err := self.sm.GetMaxUsage(ev, clnt) +func (self *SMGenericBiRpcV1) MaxUsage(clnt *rpc2.Client, ev sessionmanager.SMGenericEvent, maxUsage *float64) error { + maxUsageDur, err := self.sm.MaxUsage(ev, clnt) if err != nil { return utils.NewErrServerError(err) } @@ -61,8 +61,8 @@ func (self *SMGenericBiRpcV1) GetMaxUsage(clnt *rpc2.Client, ev sessionmanager.S } /// Returns list of suppliers which can be used for the request -func (self *SMGenericBiRpcV1) GetLcrSuppliers(clnt *rpc2.Client, ev sessionmanager.SMGenericEvent, suppliers *[]string) error { - if supls, err := self.sm.GetLcrSuppliers(ev, clnt); err != nil { +func (self *SMGenericBiRpcV1) LCRSuppliers(clnt *rpc2.Client, ev sessionmanager.SMGenericEvent, suppliers *[]string) error { + if supls, err := self.sm.LCRSuppliers(ev, clnt); err != nil { return utils.NewErrServerError(err) } else { *suppliers = supls @@ -71,8 +71,8 @@ func (self *SMGenericBiRpcV1) GetLcrSuppliers(clnt *rpc2.Client, ev sessionmanag } // Called on session start, returns the maximum number of seconds the session can last -func (self *SMGenericBiRpcV1) SessionStart(clnt *rpc2.Client, ev sessionmanager.SMGenericEvent, maxUsage *float64) error { - if minMaxUsage, err := self.sm.SessionStart(ev, clnt); err != nil { +func (self *SMGenericBiRpcV1) InitiateSession(clnt *rpc2.Client, ev sessionmanager.SMGenericEvent, maxUsage *float64) error { + if minMaxUsage, err := self.sm.InitiateSession(ev, clnt); err != nil { return utils.NewErrServerError(err) } else { *maxUsage = minMaxUsage.Seconds() @@ -81,8 +81,8 @@ func (self *SMGenericBiRpcV1) SessionStart(clnt *rpc2.Client, ev sessionmanager. } // Interim updates, returns remaining duration from the rater -func (self *SMGenericBiRpcV1) SessionUpdate(clnt *rpc2.Client, ev sessionmanager.SMGenericEvent, maxUsage *float64) error { - if minMaxUsage, err := self.sm.SessionUpdate(ev, clnt); err != nil { +func (self *SMGenericBiRpcV1) UpdateSession(clnt *rpc2.Client, ev sessionmanager.SMGenericEvent, maxUsage *float64) error { + if minMaxUsage, err := self.sm.UpdateSession(ev, clnt); err != nil { return utils.NewErrServerError(err) } else { *maxUsage = minMaxUsage.Seconds() @@ -91,8 +91,8 @@ func (self *SMGenericBiRpcV1) SessionUpdate(clnt *rpc2.Client, ev sessionmanager } // Called on session end, should stop debit loop -func (self *SMGenericBiRpcV1) SessionEnd(clnt *rpc2.Client, ev sessionmanager.SMGenericEvent, reply *string) error { - if err := self.sm.SessionEnd(ev, clnt); err != nil { +func (self *SMGenericBiRpcV1) TerminateSession(clnt *rpc2.Client, ev sessionmanager.SMGenericEvent, reply *string) error { + if err := self.sm.TerminateSession(ev, clnt); err != nil { return utils.NewErrServerError(err) } *reply = utils.OK @@ -110,8 +110,8 @@ func (self *SMGenericBiRpcV1) ChargeEvent(clnt *rpc2.Client, ev sessionmanager.S } // Called on session end, should send the CDR to CDRS -func (self *SMGenericBiRpcV1) ProcessCdr(clnt *rpc2.Client, ev sessionmanager.SMGenericEvent, reply *string) error { - if err := self.sm.ProcessCdr(ev); err != nil { +func (self *SMGenericBiRpcV1) ProcessCDR(clnt *rpc2.Client, ev sessionmanager.SMGenericEvent, reply *string) error { + if err := self.sm.ProcessCDR(ev); err != nil { return utils.NewErrServerError(err) } *reply = utils.OK diff --git a/apier/v1/smgenericv1.go b/apier/v1/smgenericv1.go index 08471bc3d..07d09a2fa 100644 --- a/apier/v1/smgenericv1.go +++ b/apier/v1/smgenericv1.go @@ -18,8 +18,8 @@ type SMGenericV1 struct { } // Returns MaxUsage (for calls in seconds), -1 for no limit -func (self *SMGenericV1) GetMaxUsage(ev sessionmanager.SMGenericEvent, maxUsage *float64) error { - maxUsageDur, err := self.sm.GetMaxUsage(ev, nil) +func (self *SMGenericV1) MaxUsage(ev sessionmanager.SMGenericEvent, maxUsage *float64) error { + maxUsageDur, err := self.sm.MaxUsage(ev, nil) if err != nil { return utils.NewErrServerError(err) } @@ -32,8 +32,8 @@ func (self *SMGenericV1) GetMaxUsage(ev sessionmanager.SMGenericEvent, maxUsage } // Returns list of suppliers which can be used for the request -func (self *SMGenericV1) GetLcrSuppliers(ev sessionmanager.SMGenericEvent, suppliers *[]string) error { - if supls, err := self.sm.GetLcrSuppliers(ev, nil); err != nil { +func (self *SMGenericV1) LCRSuppliers(ev sessionmanager.SMGenericEvent, suppliers *[]string) error { + if supls, err := self.sm.LCRSuppliers(ev, nil); err != nil { return utils.NewErrServerError(err) } else { *suppliers = supls @@ -42,8 +42,8 @@ func (self *SMGenericV1) GetLcrSuppliers(ev sessionmanager.SMGenericEvent, suppl } // Called on session start, returns the maximum number of seconds the session can last -func (self *SMGenericV1) SessionStart(ev sessionmanager.SMGenericEvent, maxUsage *float64) error { - if minMaxUsage, err := self.sm.SessionStart(ev, nil); err != nil { +func (self *SMGenericV1) InitiateSession(ev sessionmanager.SMGenericEvent, maxUsage *float64) error { + if minMaxUsage, err := self.sm.InitiateSession(ev, nil); err != nil { return utils.NewErrServerError(err) } else { *maxUsage = minMaxUsage.Seconds() @@ -52,8 +52,8 @@ func (self *SMGenericV1) SessionStart(ev sessionmanager.SMGenericEvent, maxUsage } // Interim updates, returns remaining duration from the rater -func (self *SMGenericV1) SessionUpdate(ev sessionmanager.SMGenericEvent, maxUsage *float64) error { - if minMaxUsage, err := self.sm.SessionUpdate(ev, nil); err != nil { +func (self *SMGenericV1) UpdateSession(ev sessionmanager.SMGenericEvent, maxUsage *float64) error { + if minMaxUsage, err := self.sm.UpdateSession(ev, nil); err != nil { return utils.NewErrServerError(err) } else { *maxUsage = minMaxUsage.Seconds() @@ -62,8 +62,8 @@ func (self *SMGenericV1) SessionUpdate(ev sessionmanager.SMGenericEvent, maxUsag } // Called on session end, should stop debit loop -func (self *SMGenericV1) SessionEnd(ev sessionmanager.SMGenericEvent, reply *string) error { - if err := self.sm.SessionEnd(ev, nil); err != nil { +func (self *SMGenericV1) TerminateSession(ev sessionmanager.SMGenericEvent, reply *string) error { + if err := self.sm.TerminateSession(ev, nil); err != nil { return utils.NewErrServerError(err) } *reply = utils.OK @@ -81,8 +81,8 @@ func (self *SMGenericV1) ChargeEvent(ev sessionmanager.SMGenericEvent, maxUsage } // Called on session end, should send the CDR to CDRS -func (self *SMGenericV1) ProcessCdr(ev sessionmanager.SMGenericEvent, reply *string) error { - if err := self.sm.ProcessCdr(ev); err != nil { +func (self *SMGenericV1) ProcessCDR(ev sessionmanager.SMGenericEvent, reply *string) error { + if err := self.sm.ProcessCDR(ev); err != nil { return utils.NewErrServerError(err) } *reply = utils.OK @@ -143,7 +143,7 @@ func (self *SMGenericV1) ActiveSessionsCount(attrs utils.AttrSMGGetActiveSession // rpcclient.RpcClientConnection interface func (self *SMGenericV1) Call(serviceMethod string, args interface{}, reply interface{}) error { switch serviceMethod { - case "SMGenericV1.GetMaxUsage": + case "SMGenericV1.MaxUsage": argsConverted, canConvert := args.(sessionmanager.SMGenericEvent) if !canConvert { return rpcclient.ErrWrongArgsType @@ -152,8 +152,8 @@ func (self *SMGenericV1) Call(serviceMethod string, args interface{}, reply inte if !canConvert { return rpcclient.ErrWrongReplyType } - self.GetMaxUsage(argsConverted, replyConverted) - case "SMGenericV1.GetLcrSuppliers": + self.MaxUsage(argsConverted, replyConverted) + case "SMGenericV1.LCRSuppliers": argsConverted, canConvert := args.(sessionmanager.SMGenericEvent) if !canConvert { return rpcclient.ErrWrongArgsType @@ -162,8 +162,8 @@ func (self *SMGenericV1) Call(serviceMethod string, args interface{}, reply inte if !canConvert { return rpcclient.ErrWrongReplyType } - return self.GetLcrSuppliers(argsConverted, replyConverted) - case "SMGenericV1.SessionStart": + return self.LCRSuppliers(argsConverted, replyConverted) + case "SMGenericV1.InitiateSession": argsConverted, canConvert := args.(sessionmanager.SMGenericEvent) if !canConvert { return rpcclient.ErrWrongArgsType @@ -172,8 +172,8 @@ func (self *SMGenericV1) Call(serviceMethod string, args interface{}, reply inte if !canConvert { return rpcclient.ErrWrongReplyType } - return self.SessionStart(argsConverted, replyConverted) - case "SMGenericV1.SessionUpdate": + return self.InitiateSession(argsConverted, replyConverted) + case "SMGenericV1.UpdateSession": argsConverted, canConvert := args.(sessionmanager.SMGenericEvent) if !canConvert { return rpcclient.ErrWrongArgsType @@ -182,8 +182,8 @@ func (self *SMGenericV1) Call(serviceMethod string, args interface{}, reply inte if !canConvert { return rpcclient.ErrWrongReplyType } - return self.SessionUpdate(argsConverted, replyConverted) - case "SMGenericV1.SessionEnd": + return self.UpdateSession(argsConverted, replyConverted) + case "SMGenericV1.TerminateSession": argsConverted, canConvert := args.(sessionmanager.SMGenericEvent) if !canConvert { return rpcclient.ErrWrongArgsType @@ -192,7 +192,7 @@ func (self *SMGenericV1) Call(serviceMethod string, args interface{}, reply inte if !canConvert { return rpcclient.ErrWrongReplyType } - return self.SessionEnd(argsConverted, replyConverted) + return self.TerminateSession(argsConverted, replyConverted) case "SMGenericV1.ChargeEvent": argsConverted, canConvert := args.(sessionmanager.SMGenericEvent) if !canConvert { @@ -203,7 +203,7 @@ func (self *SMGenericV1) Call(serviceMethod string, args interface{}, reply inte return rpcclient.ErrWrongReplyType } return self.ChargeEvent(argsConverted, replyConverted) - case "SMGenericV1.ProcessCdr": + case "SMGenericV1.ProcessCDR": argsConverted, canConvert := args.(sessionmanager.SMGenericEvent) if !canConvert { return rpcclient.ErrWrongArgsType @@ -212,7 +212,7 @@ func (self *SMGenericV1) Call(serviceMethod string, args interface{}, reply inte if !canConvert { return rpcclient.ErrWrongReplyType } - return self.ProcessCdr(argsConverted, replyConverted) + return self.ProcessCDR(argsConverted, replyConverted) case "SMGenericV1.ActiveSessions": argsConverted, canConvert := args.(utils.AttrSMGGetActiveSessions) if !canConvert { diff --git a/apier/v1/smgenericv1_it_test.go b/apier/v1/smgenericv1_it_test.go index 17da136f8..f1cc270d0 100644 --- a/apier/v1/smgenericv1_it_test.go +++ b/apier/v1/smgenericv1_it_test.go @@ -149,7 +149,7 @@ func TestSMGV1GetMaxUsage(t *testing.T) { setupReq := &sessionmanager.SMGenericEvent{utils.REQTYPE: utils.META_PREPAID, utils.TENANT: "cgrates.org", utils.ACCOUNT: "1003", utils.DESTINATION: "1002", utils.SETUP_TIME: "2015-11-10T15:20:00Z"} var maxTime float64 - if err := smgV1Rpc.Call("SMGenericV1.GetMaxUsage", setupReq, &maxTime); err != nil { + if err := smgV1Rpc.Call("SMGenericV1.MaxUsage", setupReq, &maxTime); err != nil { t.Error(err) } else if maxTime != 2700 { t.Errorf("Calling ApierV2.MaxUsage got maxTime: %f", maxTime) diff --git a/sessionmanager/data_it_test.go b/sessionmanager/data_it_test.go index ee73c7f38..9f7633780 100644 --- a/sessionmanager/data_it_test.go +++ b/sessionmanager/data_it_test.go @@ -109,7 +109,7 @@ func TestSMGDataLastUsedData(t *testing.T) { utils.USAGE: "1048576", } var maxUsage float64 - if err := smgRPC.Call("SMGenericV1.SessionStart", smgEv, &maxUsage); err != nil { + if err := smgRPC.Call("SMGenericV1.InitiateSession", smgEv, &maxUsage); err != nil { t.Error(err) } if maxUsage != 1.048576e+06 { @@ -137,7 +137,7 @@ func TestSMGDataLastUsedData(t *testing.T) { utils.USAGE: "1048576", utils.LastUsed: "20000", } - if err := smgRPC.Call("SMGenericV1.SessionUpdate", smgEv, &maxUsage); err != nil { + if err := smgRPC.Call("SMGenericV1.UpdateSession", smgEv, &maxUsage); err != nil { t.Error(err) } if maxUsage != 1.048576e+06 { @@ -165,7 +165,7 @@ func TestSMGDataLastUsedData(t *testing.T) { utils.LastUsed: "0", } var rpl string - if err = smgRPC.Call("SMGenericV1.SessionEnd", smgEv, &rpl); err != nil || rpl != utils.OK { + if err = smgRPC.Call("SMGenericV1.TerminateSession", smgEv, &rpl); err != nil || rpl != utils.OK { t.Error(err) } eAcntVal = 49999979520.000000 //20480 @@ -204,7 +204,7 @@ func TestSMGDataLastUsedMultipleData(t *testing.T) { utils.USAGE: "1048576", } var maxUsage float64 - if err := smgRPC.Call("SMGenericV1.SessionStart", smgEv, &maxUsage); err != nil { + if err := smgRPC.Call("SMGenericV1.InitiateSession", smgEv, &maxUsage); err != nil { t.Error(err) } if maxUsage != 1.048576e+06 { @@ -236,7 +236,7 @@ func TestSMGDataLastUsedMultipleData(t *testing.T) { utils.USAGE: "1048576", utils.LastUsed: "20000", } - if err := smgRPC.Call("SMGenericV1.SessionUpdate", smgEv, &maxUsage); err != nil { + if err := smgRPC.Call("SMGenericV1.UpdateSession", smgEv, &maxUsage); err != nil { t.Error(err) } if maxUsage != 1.048576e+06 { @@ -267,7 +267,7 @@ func TestSMGDataLastUsedMultipleData(t *testing.T) { utils.USAGE: "1048576", utils.LastUsed: "20000", } - if err := smgRPC.Call("SMGenericV1.SessionUpdate", smgEv, &maxUsage); err != nil { + if err := smgRPC.Call("SMGenericV1.UpdateSession", smgEv, &maxUsage); err != nil { t.Error(err) } if maxUsage != 1.048576e+06 { @@ -298,7 +298,7 @@ func TestSMGDataLastUsedMultipleData(t *testing.T) { utils.USAGE: "1048576", utils.LastUsed: "20000", } - if err := smgRPC.Call("SMGenericV1.SessionUpdate", smgEv, &maxUsage); err != nil { + if err := smgRPC.Call("SMGenericV1.UpdateSession", smgEv, &maxUsage); err != nil { t.Error(err) } if maxUsage != 1.048576e+06 { @@ -329,7 +329,7 @@ func TestSMGDataLastUsedMultipleData(t *testing.T) { utils.USAGE: "1048576", utils.LastUsed: "20000", } - if err := smgRPC.Call("SMGenericV1.SessionUpdate", smgEv, &maxUsage); err != nil { + if err := smgRPC.Call("SMGenericV1.UpdateSession", smgEv, &maxUsage); err != nil { t.Error(err) } if maxUsage != 1.048576e+06 { @@ -360,7 +360,7 @@ func TestSMGDataLastUsedMultipleData(t *testing.T) { utils.LastUsed: "0", } var rpl string - if err = smgRPC.Call("SMGenericV1.SessionEnd", smgEv, &rpl); err != nil || rpl != utils.OK { + if err = smgRPC.Call("SMGenericV1.TerminateSession", smgEv, &rpl); err != nil || rpl != utils.OK { t.Error(err) } eAcntVal = 49999897600.000000 @@ -404,7 +404,7 @@ func TestSMGDataDerivedChargingNoCredit(t *testing.T) { utils.USAGE: "100", } var maxUsage float64 - if err := smgRPC.Call("SMGenericV1.SessionStart", smgEv, &maxUsage); err != nil { + if err := smgRPC.Call("SMGenericV1.InitiateSession", smgEv, &maxUsage); err != nil { t.Error(err) } // the second derived charging run has no credit @@ -448,7 +448,7 @@ func TestSMGDataTTLExpired(t *testing.T) { utils.USAGE: "1048576", } var maxUsage float64 - if err := smgRPC.Call("SMGenericV1.SessionStart", smgEv, &maxUsage); err != nil { + if err := smgRPC.Call("SMGenericV1.InitiateSession", smgEv, &maxUsage); err != nil { t.Error(err) } if maxUsage != 1.048576e+06 { @@ -497,7 +497,7 @@ func TestSMGDataTTLExpiredMultiUpdates(t *testing.T) { utils.USAGE: "1048576", } var maxUsage float64 - if err := smgRPC.Call("SMGenericV1.SessionStart", smgEv, &maxUsage); err != nil { + if err := smgRPC.Call("SMGenericV1.InitiateSession", smgEv, &maxUsage); err != nil { t.Error(err) } if maxUsage != 1.048576e+06 { @@ -530,7 +530,7 @@ func TestSMGDataTTLExpiredMultiUpdates(t *testing.T) { utils.USAGE: "1048576", utils.LastUsed: "20000", } - if err := smgRPC.Call("SMGenericV1.SessionUpdate", smgEv, &maxUsage); err != nil { + if err := smgRPC.Call("SMGenericV1.UpdateSession", smgEv, &maxUsage); err != nil { t.Error(err) } if maxUsage != 1.048576e+06 { @@ -585,7 +585,7 @@ func TestSMGDataMultipleDataNoUsage(t *testing.T) { utils.USAGE: "1048576", } var maxUsage float64 - if err := smgRPC.Call("SMGenericV1.SessionStart", smgEv, &maxUsage); err != nil { + if err := smgRPC.Call("SMGenericV1.InitiateSession", smgEv, &maxUsage); err != nil { t.Error(err) } if maxUsage != 1.048576e+06 { @@ -617,7 +617,7 @@ func TestSMGDataMultipleDataNoUsage(t *testing.T) { utils.USAGE: "1048576", utils.LastUsed: "0", } - if err := smgRPC.Call("SMGenericV1.SessionUpdate", smgEv, &maxUsage); err != nil { + if err := smgRPC.Call("SMGenericV1.UpdateSession", smgEv, &maxUsage); err != nil { t.Error(err) } if maxUsage != 1.048576e+06 { @@ -648,7 +648,7 @@ func TestSMGDataMultipleDataNoUsage(t *testing.T) { utils.USAGE: "1048576", utils.LastUsed: "0", } - if err := smgRPC.Call("SMGenericV1.SessionUpdate", smgEv, &maxUsage); err != nil { + if err := smgRPC.Call("SMGenericV1.UpdateSession", smgEv, &maxUsage); err != nil { t.Error(err) } if maxUsage != 1.048576e+06 { @@ -679,7 +679,7 @@ func TestSMGDataMultipleDataNoUsage(t *testing.T) { utils.USAGE: "1048576", utils.LastUsed: "0", } - if err := smgRPC.Call("SMGenericV1.SessionUpdate", smgEv, &maxUsage); err != nil { + if err := smgRPC.Call("SMGenericV1.UpdateSession", smgEv, &maxUsage); err != nil { t.Error(err) } if maxUsage != 1.048576e+06 { @@ -710,7 +710,7 @@ func TestSMGDataMultipleDataNoUsage(t *testing.T) { utils.USAGE: "1048576", utils.LastUsed: "0", } - if err := smgRPC.Call("SMGenericV1.SessionUpdate", smgEv, &maxUsage); err != nil { + if err := smgRPC.Call("SMGenericV1.UpdateSession", smgEv, &maxUsage); err != nil { t.Error(err) } if maxUsage != 1.048576e+06 { @@ -741,7 +741,7 @@ func TestSMGDataMultipleDataNoUsage(t *testing.T) { utils.LastUsed: "0", } var rpl string - if err = smgRPC.Call("SMGenericV1.SessionEnd", smgEv, &rpl); err != nil || rpl != utils.OK { + if err = smgRPC.Call("SMGenericV1.TerminateSession", smgEv, &rpl); err != nil || rpl != utils.OK { t.Error(err) } eAcntVal = 49997767680.000000 // refunded @@ -785,7 +785,7 @@ func TestSMGDataMultipleDataConstantUsage(t *testing.T) { utils.USAGE: "1048576", } var maxUsage float64 - if err := smgRPC.Call("SMGenericV1.SessionStart", smgEv, &maxUsage); err != nil { + if err := smgRPC.Call("SMGenericV1.InitiateSession", smgEv, &maxUsage); err != nil { t.Error(err) } if maxUsage != 1.048576e+06 { @@ -818,7 +818,7 @@ func TestSMGDataMultipleDataConstantUsage(t *testing.T) { utils.USAGE: "1048576", utils.LastUsed: "600", } - if err := smgRPC.Call("SMGenericV1.SessionUpdate", smgEv, &maxUsage); err != nil { + if err := smgRPC.Call("SMGenericV1.UpdateSession", smgEv, &maxUsage); err != nil { t.Error(err) } if maxUsage != 1.048576e+06 { @@ -849,7 +849,7 @@ func TestSMGDataMultipleDataConstantUsage(t *testing.T) { utils.USAGE: "1048576", utils.LastUsed: "600", } - if err := smgRPC.Call("SMGenericV1.SessionUpdate", smgEv, &maxUsage); err != nil { + if err := smgRPC.Call("SMGenericV1.UpdateSession", smgEv, &maxUsage); err != nil { t.Error(err) } if maxUsage != 1.048576e+06 { @@ -880,7 +880,7 @@ func TestSMGDataMultipleDataConstantUsage(t *testing.T) { utils.USAGE: "1048576", utils.LastUsed: "600", } - if err := smgRPC.Call("SMGenericV1.SessionUpdate", smgEv, &maxUsage); err != nil { + if err := smgRPC.Call("SMGenericV1.UpdateSession", smgEv, &maxUsage); err != nil { t.Error(err) } if maxUsage != 1.048576e+06 { @@ -911,7 +911,7 @@ func TestSMGDataMultipleDataConstantUsage(t *testing.T) { utils.USAGE: "1048576", utils.LastUsed: "600", } - if err := smgRPC.Call("SMGenericV1.SessionUpdate", smgEv, &maxUsage); err != nil { + if err := smgRPC.Call("SMGenericV1.UpdateSession", smgEv, &maxUsage); err != nil { t.Error(err) } if maxUsage != 1.048576e+06 { @@ -942,7 +942,7 @@ func TestSMGDataMultipleDataConstantUsage(t *testing.T) { utils.LastUsed: "0", } var rpl string - if err = smgRPC.Call("SMGenericV1.SessionEnd", smgEv, &rpl); err != nil || rpl != utils.OK { + if err = smgRPC.Call("SMGenericV1.TerminateSession", smgEv, &rpl); err != nil || rpl != utils.OK { t.Error(err) } eAcntVal = 49997757440.000000 // 10240 (from the start) diff --git a/sessionmanager/smg_it_test.go b/sessionmanager/smg_it_test.go index b14e4adf0..1ae469fbf 100644 --- a/sessionmanager/smg_it_test.go +++ b/sessionmanager/smg_it_test.go @@ -130,7 +130,7 @@ func TestSMGVoiceMonetaryRefund(t *testing.T) { utils.USAGE: "1m30s", } var maxUsage float64 - if err := smgRPC.Call("SMGenericV1.SessionStart", smgEv, &maxUsage); err != nil { + if err := smgRPC.Call("SMGenericV1.InitiateSession", smgEv, &maxUsage); err != nil { t.Error(err) } if maxUsage != 90 { @@ -160,7 +160,7 @@ func TestSMGVoiceMonetaryRefund(t *testing.T) { utils.USAGE: "1m", } var rpl string - if err = smgRPC.Call("SMGenericV1.SessionEnd", smgEv, &rpl); err != nil || rpl != utils.OK { + if err = smgRPC.Call("SMGenericV1.TerminateSession", smgEv, &rpl); err != nil || rpl != utils.OK { t.Error(err) } eAcntVal = 8.8 @@ -191,7 +191,7 @@ func TestSMGVoiceVoiceRefund(t *testing.T) { utils.USAGE: "1m30s", } var maxUsage float64 - if err := smgRPC.Call("SMGenericV1.SessionStart", smgEv, &maxUsage); err != nil { + if err := smgRPC.Call("SMGenericV1.InitiateSession", smgEv, &maxUsage); err != nil { t.Error(err) } if maxUsage != 90 { @@ -221,7 +221,7 @@ func TestSMGVoiceVoiceRefund(t *testing.T) { utils.USAGE: "1m", } var rpl string - if err = smgRPC.Call("SMGenericV1.SessionEnd", smgEv, &rpl); err != nil || rpl != utils.OK { + if err = smgRPC.Call("SMGenericV1.TerminateSession", smgEv, &rpl); err != nil || rpl != utils.OK { t.Error(err) } eAcntVal = 150.0 @@ -259,7 +259,7 @@ func TestSMGVoiceMixedRefund(t *testing.T) { utils.USAGE: "1m30s", } var maxUsage float64 - if err := smgRPC.Call("SMGenericV1.SessionStart", smgEv, &maxUsage); err != nil { + if err := smgRPC.Call("SMGenericV1.InitiateSession", smgEv, &maxUsage); err != nil { t.Error(err) } if maxUsage != 90 { @@ -291,7 +291,7 @@ func TestSMGVoiceMixedRefund(t *testing.T) { utils.USAGE: "1m", } var rpl string - if err = smgRPC.Call("SMGenericV1.SessionEnd", smgEv, &rpl); err != nil || rpl != utils.OK { + if err = smgRPC.Call("SMGenericV1.TerminateSession", smgEv, &rpl); err != nil || rpl != utils.OK { t.Error(err) } eVoiceVal = 90.0 @@ -334,7 +334,7 @@ func TestSMGVoiceLastUsed(t *testing.T) { utils.USAGE: "2m", } var maxUsage float64 - if err := smgRPC.Call("SMGenericV1.SessionStart", smgEv, &maxUsage); err != nil { + if err := smgRPC.Call("SMGenericV1.InitiateSession", smgEv, &maxUsage); err != nil { t.Error(err) } if maxUsage != 120 { @@ -360,7 +360,7 @@ func TestSMGVoiceLastUsed(t *testing.T) { utils.USAGE: "2m", utils.LastUsed: "1m30s", } - if err := smgRPC.Call("SMGenericV1.SessionUpdate", smgEv, &maxUsage); err != nil { + if err := smgRPC.Call("SMGenericV1.UpdateSession", smgEv, &maxUsage); err != nil { t.Error(err) } if maxUsage != 120 { @@ -386,7 +386,7 @@ func TestSMGVoiceLastUsed(t *testing.T) { utils.USAGE: "2m", utils.LastUsed: "2m30s", } - if err := smgRPC.Call("SMGenericV1.SessionUpdate", smgEv, &maxUsage); err != nil { + if err := smgRPC.Call("SMGenericV1.UpdateSession", smgEv, &maxUsage); err != nil { t.Error(err) } if maxUsage != 120 { @@ -412,7 +412,7 @@ func TestSMGVoiceLastUsed(t *testing.T) { utils.USAGE: "1m", } var rpl string - if err = smgRPC.Call("SMGenericV1.SessionEnd", smgEv, &rpl); err != nil || rpl != utils.OK { + if err = smgRPC.Call("SMGenericV1.TerminateSession", smgEv, &rpl); err != nil || rpl != utils.OK { t.Error(err) } eAcntVal = 7.59 @@ -451,7 +451,7 @@ func TestSMGVoiceLastUsedEnd(t *testing.T) { utils.USAGE: "2m", } var maxUsage float64 - if err := smgRPC.Call("SMGenericV1.SessionStart", smgEv, &maxUsage); err != nil { + if err := smgRPC.Call("SMGenericV1.InitiateSession", smgEv, &maxUsage); err != nil { t.Error(err) } if maxUsage != 120 { @@ -477,7 +477,7 @@ func TestSMGVoiceLastUsedEnd(t *testing.T) { utils.USAGE: "2m", utils.LastUsed: "30s", } - if err := smgRPC.Call("SMGenericV1.SessionUpdate", smgEv, &maxUsage); err != nil { + if err := smgRPC.Call("SMGenericV1.UpdateSession", smgEv, &maxUsage); err != nil { t.Error(err) } if maxUsage != 120 { @@ -503,7 +503,7 @@ func TestSMGVoiceLastUsedEnd(t *testing.T) { utils.LastUsed: "0s", } var rpl string - if err = smgRPC.Call("SMGenericV1.SessionEnd", smgEv, &rpl); err != nil || rpl != utils.OK { + if err = smgRPC.Call("SMGenericV1.TerminateSession", smgEv, &rpl); err != nil || rpl != utils.OK { t.Error(err) } eAcntVal = 6.590000 @@ -542,7 +542,7 @@ func TestSMGVoiceLastUsedNotFixed(t *testing.T) { utils.USAGE: "2m", } var maxUsage float64 - if err := smgRPC.Call("SMGenericV1.SessionStart", smgEv, &maxUsage); err != nil { + if err := smgRPC.Call("SMGenericV1.InitiateSession", smgEv, &maxUsage); err != nil { t.Error(err) } if maxUsage != 120 { @@ -568,7 +568,7 @@ func TestSMGVoiceLastUsedNotFixed(t *testing.T) { utils.USAGE: "2m", utils.LastUsed: "13s", } - if err := smgRPC.Call("SMGenericV1.SessionUpdate", smgEv, &maxUsage); err != nil { + if err := smgRPC.Call("SMGenericV1.UpdateSession", smgEv, &maxUsage); err != nil { t.Error(err) } if maxUsage != 120 { @@ -594,7 +594,7 @@ func TestSMGVoiceLastUsedNotFixed(t *testing.T) { utils.LastUsed: "0s", } var rpl string - if err = smgRPC.Call("SMGenericV1.SessionEnd", smgEv, &rpl); err != nil || rpl != utils.OK { + if err = smgRPC.Call("SMGenericV1.TerminateSession", smgEv, &rpl); err != nil || rpl != utils.OK { t.Error(err) } eAcntVal = 5.590000 @@ -633,7 +633,7 @@ func TestSMGVoiceSessionTTL(t *testing.T) { utils.USAGE: "2m", } var maxUsage float64 - if err := smgRPC.Call("SMGenericV1.SessionStart", smgEv, &maxUsage); err != nil { + if err := smgRPC.Call("SMGenericV1.InitiateSession", smgEv, &maxUsage); err != nil { t.Error(err) } if maxUsage != 120 { @@ -667,7 +667,7 @@ func TestSMGVoiceSessionTTL(t *testing.T) { utils.USAGE: "2m", utils.LastUsed: "30s", } - if err := smgRPC.Call("SMGenericV1.SessionUpdate", smgEv, &maxUsage); err != nil { + if err := smgRPC.Call("SMGenericV1.UpdateSession", smgEv, &maxUsage); err != nil { t.Error(err) } if maxUsage != 120 { diff --git a/sessionmanager/smgeneric.go b/sessionmanager/smgeneric.go index eb4873bd8..005750af1 100644 --- a/sessionmanager/smgeneric.go +++ b/sessionmanager/smgeneric.go @@ -258,7 +258,7 @@ func (self *SMGeneric) sessionRelocate(sessionID, initialID string) error { // Methods to apply on sessions, mostly exported through RPC/Bi-RPC //Calculates maximum usage allowed for gevent -func (self *SMGeneric) GetMaxUsage(gev SMGenericEvent, clnt *rpc2.Client) (time.Duration, error) { +func (self *SMGeneric) MaxUsage(gev SMGenericEvent, clnt *rpc2.Client) (time.Duration, error) { gev[utils.EVENT_NAME] = utils.CGR_AUTHORIZATION storedCdr := gev.AsStoredCdr(config.CgrConfig(), self.timezone) var maxDur float64 @@ -268,7 +268,7 @@ func (self *SMGeneric) GetMaxUsage(gev SMGenericEvent, clnt *rpc2.Client) (time. return time.Duration(maxDur), nil } -func (self *SMGeneric) GetLcrSuppliers(gev SMGenericEvent, clnt *rpc2.Client) ([]string, error) { +func (self *SMGeneric) LCRSuppliers(gev SMGenericEvent, clnt *rpc2.Client) ([]string, error) { gev[utils.EVENT_NAME] = utils.CGR_LCR_REQUEST cd, err := gev.AsLcrRequest().AsCallDescriptor(self.timezone) cd.CgrID = gev.GetCgrId(self.timezone) @@ -287,12 +287,12 @@ func (self *SMGeneric) GetLcrSuppliers(gev SMGenericEvent, clnt *rpc2.Client) ([ } // Called on session start -func (self *SMGeneric) SessionStart(gev SMGenericEvent, clnt *rpc2.Client) (time.Duration, error) { +func (self *SMGeneric) InitiateSession(gev SMGenericEvent, clnt *rpc2.Client) (time.Duration, error) { if err := self.sessionStart(gev, getClientConnId(clnt)); err != nil { self.sessionEnd(gev.GetUUID(), 0) return nilDuration, err } - d, err := self.SessionUpdate(gev, clnt) + d, err := self.UpdateSession(gev, clnt) if err != nil || d == 0 { self.sessionEnd(gev.GetUUID(), 0) } @@ -300,7 +300,7 @@ func (self *SMGeneric) SessionStart(gev SMGenericEvent, clnt *rpc2.Client) (time } // Execute debits for usage/maxUsage -func (self *SMGeneric) SessionUpdate(gev SMGenericEvent, clnt *rpc2.Client) (time.Duration, error) { +func (self *SMGeneric) UpdateSession(gev SMGenericEvent, clnt *rpc2.Client) (time.Duration, error) { self.resetTerminatorTimer(gev.GetUUID(), gev.GetSessionTTL(), gev.GetSessionTTLLastUsed(), gev.GetSessionTTLUsage()) if initialID, err := gev.GetFieldAsString(utils.InitialOriginID); err == nil { err := self.sessionRelocate(gev.GetUUID(), initialID) @@ -342,7 +342,7 @@ func (self *SMGeneric) SessionUpdate(gev SMGenericEvent, clnt *rpc2.Client) (tim } // Called on session end, should stop debit loop -func (self *SMGeneric) SessionEnd(gev SMGenericEvent, clnt *rpc2.Client) error { +func (self *SMGeneric) TerminateSession(gev SMGenericEvent, clnt *rpc2.Client) error { if initialID, err := gev.GetFieldAsString(utils.InitialOriginID); err == nil { err := self.sessionRelocate(gev.GetUUID(), initialID) if err == utils.ErrNotFound { // Session was already relocated, create a new session with this update @@ -488,7 +488,7 @@ func (self *SMGeneric) ChargeEvent(gev SMGenericEvent, clnt *rpc2.Client) (maxDu return maxDur, nil } -func (self *SMGeneric) ProcessCdr(gev SMGenericEvent) error { +func (self *SMGeneric) ProcessCDR(gev SMGenericEvent) error { var reply string if err := self.cdrsrv.Call("CdrsV1.ProcessCdr", gev.AsStoredCdr(self.cgrCfg, self.timezone), &reply); err != nil { return err From 814531997bde6e8c8722a6834e81faaf3c0fbb7d Mon Sep 17 00:00:00 2001 From: DanB Date: Sun, 5 Jun 2016 15:49:36 +0200 Subject: [PATCH 07/15] SMG - Fix session timeouts in case of session relocation --- apier/v1/accounts.go | 23 +------ console/balance_set.go | 5 +- sessionmanager/smg_it_test.go | 116 ++++++++++++++++++++++++++++++++++ sessionmanager/smgeneric.go | 3 +- utils/apitpdata.go | 19 ++++++ 5 files changed, 141 insertions(+), 25 deletions(-) diff --git a/apier/v1/accounts.go b/apier/v1/accounts.go index 620b64c48..0085dec86 100644 --- a/apier/v1/accounts.go +++ b/apier/v1/accounts.go @@ -458,26 +458,7 @@ func (self *ApierV1) modifyBalance(aType string, attr *AttrAddBalance, reply *st return nil } -type AttrSetBalance struct { - Tenant string - Account string - BalanceType string - BalanceUUID *string - BalanceID *string - Directions *string - Value *float64 - ExpiryTime *string - RatingSubject *string - Categories *string - DestinationIds *string - TimingIds *string - Weight *float64 - SharedGroups *string - Blocker *bool - Disabled *bool -} - -func (self *ApierV1) SetBalance(attr *AttrSetBalance, reply *string) error { +func (self *ApierV1) SetBalance(attr *utils.AttrSetBalance, reply *string) error { if missing := utils.MissingStructFields(attr, []string{"Tenant", "Account", "BalanceType"}); len(missing) != 0 { return utils.NewErrMandatoryIeMissing(missing...) } @@ -548,7 +529,7 @@ func (self *ApierV1) SetBalance(attr *AttrSetBalance, reply *string) error { return nil } -func (self *ApierV1) RemoveBalances(attr *AttrSetBalance, reply *string) error { +func (self *ApierV1) RemoveBalances(attr *utils.AttrSetBalance, reply *string) error { if missing := utils.MissingStructFields(attr, []string{"Tenant", "Account", "BalanceType"}); len(missing) != 0 { return utils.NewErrMandatoryIeMissing(missing...) } diff --git a/console/balance_set.go b/console/balance_set.go index bc52e8489..0cbd862e7 100644 --- a/console/balance_set.go +++ b/console/balance_set.go @@ -19,7 +19,6 @@ along with this program. If not, see package console import ( - "github.com/cgrates/cgrates/apier/v1" "github.com/cgrates/cgrates/utils" ) @@ -36,7 +35,7 @@ func init() { type CmdSetBalance struct { name string rpcMethod string - rpcParams *v1.AttrSetBalance + rpcParams *utils.AttrSetBalance *CommandExecuter } @@ -50,7 +49,7 @@ func (self *CmdSetBalance) RpcMethod() string { func (self *CmdSetBalance) RpcParams(reset bool) interface{} { if reset || self.rpcParams == nil { - self.rpcParams = &v1.AttrSetBalance{BalanceType: utils.MONETARY} + self.rpcParams = &utils.AttrSetBalance{BalanceType: utils.MONETARY} } return self.rpcParams } diff --git a/sessionmanager/smg_it_test.go b/sessionmanager/smg_it_test.go index 1ae469fbf..bf6025dae 100644 --- a/sessionmanager/smg_it_test.go +++ b/sessionmanager/smg_it_test.go @@ -708,3 +708,119 @@ func TestSMGVoiceSessionTTL(t *testing.T) { } } } + +func TestSMGVoiceSessionTTLWithRelocate(t *testing.T) { + if !*testIntegration { + return + } + attrSetBalance := utils.AttrSetBalance{Tenant: "cgrates.org", Account: "TestTTLWithRelocate", BalanceType: utils.VOICE, BalanceID: utils.StringPointer("TestTTLWithRelocate"), + Value: utils.Float64Pointer(300), RatingSubject: utils.StringPointer("*zero50ms")} + var reply string + if err := smgRPC.Call("ApierV2.SetBalance", attrSetBalance, &reply); err != nil { + t.Error(err) + } else if reply != utils.OK { + t.Errorf("Received: %s", reply) + } + var acnt *engine.Account + attrs := &utils.AttrGetAccount{Tenant: attrSetBalance.Tenant, Account: attrSetBalance.Account} + eAcntVal := 300.0 + if err := smgRPC.Call("ApierV2.GetAccount", attrs, &acnt); err != nil { + t.Error(err) + } else if acnt.BalanceMap[utils.VOICE].GetTotalValue() != eAcntVal { + t.Errorf("Expecting: %f, received: %f", eAcntVal, acnt.BalanceMap[utils.VOICE].GetTotalValue()) + } + smgEv := SMGenericEvent{ + utils.EVENT_NAME: "TEST_EVENT_SESSION_TTL_RELOCATE", + utils.TOR: utils.VOICE, + utils.ACCID: "12361", + utils.DIRECTION: utils.OUT, + utils.ACCOUNT: "TestTTLWithRelocate", + utils.SUBJECT: "TestTTLWithRelocate", + utils.DESTINATION: "1009", + utils.CATEGORY: "call", + utils.TENANT: "cgrates.org", + utils.REQTYPE: utils.META_PREPAID, + utils.SETUP_TIME: "2016-01-05 18:30:49", + utils.ANSWER_TIME: "2016-01-05 18:31:05", + utils.USAGE: "2m", + } + var maxUsage float64 + if err := smgRPC.Call("SMGenericV1.InitiateSession", smgEv, &maxUsage); err != nil { + t.Error(err) + } + if maxUsage != 120 { + t.Error("Bad max usage: ", maxUsage) + } + eAcntVal = 180.0 + if err := smgRPC.Call("ApierV2.GetAccount", attrs, &acnt); err != nil { + t.Error(err) + } else if acnt.BalanceMap[utils.VOICE].GetTotalValue() != eAcntVal { + t.Errorf("Expecting: %f, received: %f", eAcntVal, acnt.BalanceMap[utils.VOICE].GetTotalValue()) + } + var aSessions []*ActiveSession + if err := smgRPC.Call("SMGenericV1.ActiveSessions", utils.AttrSMGGetActiveSessions{RunID: utils.StringPointer(utils.META_DEFAULT), OriginID: utils.StringPointer(smgEv.GetUUID())}, &aSessions); err != nil { + t.Error(err) + } else if len(aSessions) != 1 { + t.Errorf("Unexpected number of sessions received: %+v", aSessions) + } else if aSessions[0].Usage != time.Duration(120)*time.Second { + t.Errorf("Expecting 2m, received usage: %v", aSessions[0].Usage) + } + smgEv = SMGenericEvent{ + utils.EVENT_NAME: smgEv[utils.EVENT_NAME], + utils.TOR: smgEv[utils.TOR], + utils.InitialOriginID: smgEv[utils.ACCID], + utils.ACCID: "12362", + utils.DIRECTION: smgEv[utils.DIRECTION], + utils.ACCOUNT: smgEv[utils.ACCOUNT], + utils.SUBJECT: smgEv[utils.SUBJECT], + utils.DESTINATION: smgEv[utils.DESTINATION], + utils.CATEGORY: smgEv[utils.CATEGORY], + utils.TENANT: smgEv[utils.TENANT], + utils.REQTYPE: smgEv[utils.REQTYPE], + utils.USAGE: "2m", + utils.LastUsed: "30s", + } + if err := smgRPC.Call("SMGenericV1.UpdateSession", smgEv, &maxUsage); err != nil { + t.Error(err) + } + if maxUsage != 120 { + t.Error("Bad max usage: ", maxUsage) + } + eAcntVal = 150.0 + if err := smgRPC.Call("ApierV2.GetAccount", attrs, &acnt); err != nil { + t.Error(err) + } else if acnt.BalanceMap[utils.VOICE].GetTotalValue() != eAcntVal { + t.Errorf("Expecting: %f, received: %f", eAcntVal, acnt.BalanceMap[utils.VOICE].GetTotalValue()) + } + if err := smgRPC.Call("SMGenericV1.ActiveSessions", utils.AttrSMGGetActiveSessions{RunID: utils.StringPointer(utils.META_DEFAULT), OriginID: utils.StringPointer(smgEv.GetUUID())}, &aSessions); err != nil { + t.Error(err) + } else if len(aSessions) != 1 { + t.Errorf("Unexpected number of sessions received: %+v", aSessions) + } else if aSessions[0].Usage != time.Duration(150)*time.Second { + t.Errorf("Expecting 2m30s, received usage: %v", aSessions[0].Usage) + } + time.Sleep(100 * time.Millisecond) + eAcntVal = 149.95 + if err := smgRPC.Call("ApierV2.GetAccount", attrs, &acnt); err != nil { + t.Error(err) + } else if acnt.BalanceMap[utils.VOICE].GetTotalValue() != eAcntVal { + t.Errorf("Expecting: %f, received: %f", eAcntVal, acnt.BalanceMap[utils.VOICE].GetTotalValue()) + } + if err := smgRPC.Call("SMGenericV1.ActiveSessions", utils.AttrSMGGetActiveSessions{RunID: utils.StringPointer(utils.META_DEFAULT), OriginID: utils.StringPointer(smgEv.GetUUID())}, &aSessions); err != nil { + t.Error(err) + } else if len(aSessions) != 0 { + t.Errorf("Unexpected number of sessions received: %+v", aSessions) + } + var cdrs []*engine.ExternalCDR + req := utils.RPCCDRsFilter{RunIDs: []string{utils.META_DEFAULT}, DestinationPrefixes: []string{smgEv.GetDestination(utils.META_DEFAULT)}} + if err := smgRPC.Call("ApierV2.GetCdrs", req, &cdrs); err != nil { + t.Error("Unexpected error: ", err.Error()) + } else if len(cdrs) != 1 { + t.Error("Unexpected number of CDRs returned: ", len(cdrs)) + } else { + if cdrs[0].Usage != "150.05" { + t.Errorf("Unexpected CDR Usage received, cdr: %v %+v ", cdrs[0].Usage, cdrs[0]) + } + } + +} diff --git a/sessionmanager/smgeneric.go b/sessionmanager/smgeneric.go index 005750af1..de1135168 100644 --- a/sessionmanager/smgeneric.go +++ b/sessionmanager/smgeneric.go @@ -246,6 +246,7 @@ func (self *SMGeneric) sessionRelocate(sessionID, initialID string) error { return nil, utils.ErrNotFound } for i, s := range ss { + s.eventStart[utils.ACCID] = sessionID // Overwrite initialSessionID with new one self.indexSession(sessionID, s) if i == 0 { self.unindexSession(initialID) @@ -301,7 +302,6 @@ func (self *SMGeneric) InitiateSession(gev SMGenericEvent, clnt *rpc2.Client) (t // Execute debits for usage/maxUsage func (self *SMGeneric) UpdateSession(gev SMGenericEvent, clnt *rpc2.Client) (time.Duration, error) { - self.resetTerminatorTimer(gev.GetUUID(), gev.GetSessionTTL(), gev.GetSessionTTLLastUsed(), gev.GetSessionTTLUsage()) if initialID, err := gev.GetFieldAsString(utils.InitialOriginID); err == nil { err := self.sessionRelocate(gev.GetUUID(), initialID) if err == utils.ErrNotFound { // Session was already relocated, create a new session with this update @@ -311,6 +311,7 @@ func (self *SMGeneric) UpdateSession(gev SMGenericEvent, clnt *rpc2.Client) (tim return nilDuration, err } } + self.resetTerminatorTimer(gev.GetUUID(), gev.GetSessionTTL(), gev.GetSessionTTLLastUsed(), gev.GetSessionTTLUsage()) var lastUsed *time.Duration evLastUsed, err := gev.GetLastUsed(utils.META_DEFAULT) if err != nil && err != utils.ErrNotFound { diff --git a/utils/apitpdata.go b/utils/apitpdata.go index 18bbf5c23..ed9cee7f6 100644 --- a/utils/apitpdata.go +++ b/utils/apitpdata.go @@ -1178,3 +1178,22 @@ type AttrRateCDRs struct { SendToStatS *bool // Set to true if the CDRs should be sent to stats server ReplicateCDRs *bool // Replicate results } + +type AttrSetBalance struct { + Tenant string + Account string + BalanceType string + BalanceUUID *string + BalanceID *string + Directions *string + Value *float64 + ExpiryTime *string + RatingSubject *string + Categories *string + DestinationIds *string + TimingIds *string + Weight *float64 + SharedGroups *string + Blocker *bool + Disabled *bool +} From 979203c65733196d8ee9542598d5cf2e53bbbbfc Mon Sep 17 00:00:00 2001 From: DanB Date: Sun, 5 Jun 2016 19:07:12 +0200 Subject: [PATCH 08/15] Revenue protection through Min-/MaxCost filters to GetLCR APIs, fixes #411 --- apier/v1/lcr.go | 4 ++-- engine/calldesc.go | 10 +++++++++- engine/lcr.go | 6 ++++++ engine/lcr_test.go | 4 ++-- engine/responder.go | 3 ++- 5 files changed, 21 insertions(+), 6 deletions(-) diff --git a/apier/v1/lcr.go b/apier/v1/lcr.go index 2b3850eef..638f24234 100644 --- a/apier/v1/lcr.go +++ b/apier/v1/lcr.go @@ -32,7 +32,7 @@ func (self *ApierV1) GetLcr(lcrReq engine.LcrRequest, lcrReply *engine.LcrReply) return err } var lcrQried engine.LCRCost - if err := self.Responder.GetLCR(&engine.AttrGetLcr{CallDescriptor: cd, Paginator: lcrReq.Paginator}, &lcrQried); err != nil { + if err := self.Responder.GetLCR(&engine.AttrGetLcr{CallDescriptor: cd, LCRFilter: lcrReq.LCRFilter, Paginator: lcrReq.Paginator}, &lcrQried); err != nil { return utils.NewErrServerError(err) } if lcrQried.Entry == nil { @@ -65,7 +65,7 @@ func (self *ApierV1) GetLcrSuppliers(lcrReq engine.LcrRequest, suppliers *string return err } var lcrQried engine.LCRCost - if err := self.Responder.GetLCR(&engine.AttrGetLcr{CallDescriptor: cd, Paginator: lcrReq.Paginator}, &lcrQried); err != nil { + if err := self.Responder.GetLCR(&engine.AttrGetLcr{CallDescriptor: cd, LCRFilter: lcrReq.LCRFilter, Paginator: lcrReq.Paginator}, &lcrQried); err != nil { return utils.NewErrServerError(err) } if lcrQried.HasErrors() { diff --git a/engine/calldesc.go b/engine/calldesc.go index d62a0005e..0f4097277 100644 --- a/engine/calldesc.go +++ b/engine/calldesc.go @@ -966,7 +966,7 @@ func (cd *CallDescriptor) GetLCRFromStorage() (*LCR, error) { return nil, utils.ErrNotFound } -func (cd *CallDescriptor) GetLCR(stats rpcclient.RpcClientConnection, p *utils.Paginator) (*LCRCost, error) { +func (cd *CallDescriptor) GetLCR(stats rpcclient.RpcClientConnection, lcrFltr *LCRFilter, p *utils.Paginator) (*LCRCost, error) { cd.account = nil // make sure it's not cached lcr, err := cd.GetLCRFromStorage() if err != nil { @@ -1259,6 +1259,14 @@ func (cd *CallDescriptor) GetLCR(stats rpcclient.RpcClientConnection, p *utils.P }) continue } else { + if lcrFltr != nil { + if lcrFltr.MinCost != nil && cc.Cost < *lcrFltr.MinCost { + continue // MinCost not reached, ignore the supplier + } + if lcrFltr.MaxCost != nil && cc.Cost >= *lcrFltr.MaxCost { + continue // Equal or higher than MaxCost allowed, ignore the supplier + } + } supplCost := &LCRSupplierCost{ Supplier: fullSupplier, Cost: cc.Cost, diff --git a/engine/lcr.go b/engine/lcr.go index 2a50c6003..f3de6183f 100644 --- a/engine/lcr.go +++ b/engine/lcr.go @@ -58,9 +58,15 @@ type LcrRequest struct { Duration string IgnoreErrors bool ExtraFields map[string]string + *LCRFilter *utils.Paginator } +type LCRFilter struct { + MinCost *float64 + MaxCost *float64 +} + func (self *LcrRequest) AsCallDescriptor(timezone string) (*CallDescriptor, error) { if len(self.Account) == 0 || len(self.Destination) == 0 { return nil, utils.ErrMandatoryIeMissing diff --git a/engine/lcr_test.go b/engine/lcr_test.go index 49f201cff..e5a2e5377 100644 --- a/engine/lcr_test.go +++ b/engine/lcr_test.go @@ -204,7 +204,7 @@ func TestLcrGet(t *testing.T) { Account: "rif", Subject: "rif", } - lcr, err := cd.GetLCR(nil, nil) + lcr, err := cd.GetLCR(nil, nil, nil) if err != nil || lcr == nil { t.Errorf("Bad lcr: %+v, %v", lcr, err) } @@ -222,7 +222,7 @@ func TestLcrGetPrefix(t *testing.T) { Account: "rif", Subject: "rifus", } - lcr, err := cd.GetLCR(nil, nil) + lcr, err := cd.GetLCR(nil, nil, nil) if err != nil || lcr == nil { t.Errorf("Bad lcr: %+v, %v", lcr, err) } diff --git a/engine/responder.go b/engine/responder.go index f85daa733..6de7c4d53 100644 --- a/engine/responder.go +++ b/engine/responder.go @@ -43,6 +43,7 @@ type SessionRun struct { type AttrGetLcr struct { *CallDescriptor + *LCRFilter *utils.Paginator } @@ -543,7 +544,7 @@ func (rs *Responder) GetLCR(attrs *AttrGetLcr, reply *LCRCost) error { rs.getCache().Cache(cacheKey, &cache2go.CacheItem{Err: err}) return err } - lcrCost, err := attrs.CallDescriptor.GetLCR(rs.Stats, attrs.Paginator) + lcrCost, err := attrs.CallDescriptor.GetLCR(rs.Stats, attrs.LCRFilter, attrs.Paginator) if err != nil { rs.getCache().Cache(cacheKey, &cache2go.CacheItem{Err: err}) return err From 1789f7b11fd87f6e3d5dcf62e9280d3d630a652d Mon Sep 17 00:00:00 2001 From: DanB Date: Mon, 6 Jun 2016 11:45:50 +0200 Subject: [PATCH 09/15] Using *any in tutorial/tariffplan samples --- data/tariffplans/tutorial/RatingPlans.csv | 6 +++--- data/tariffplans/tutorial/Timings.csv | 2 -- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/data/tariffplans/tutorial/RatingPlans.csv b/data/tariffplans/tutorial/RatingPlans.csv index b983bf4ba..59dc663d7 100644 --- a/data/tariffplans/tutorial/RatingPlans.csv +++ b/data/tariffplans/tutorial/RatingPlans.csv @@ -3,7 +3,7 @@ RP_RETAIL1,DR_FS_40CNT,PEAK,10 RP_RETAIL1,DR_FS_10CNT,OFFPEAK_MORNING,10 RP_RETAIL1,DR_FS_10CNT,OFFPEAK_EVENING,10 RP_RETAIL1,DR_FS_10CNT,OFFPEAK_WEEKEND,10 -RP_RETAIL1,DR_1007_MAXCOST_DISC,ALWAYS,10 +RP_RETAIL1,DR_1007_MAXCOST_DISC,*any,10 RP_RETAIL2,DR_1002_20CNT,PEAK,10 RP_RETAIL2,DR_1003_20CNT,PEAK,10 RP_RETAIL2,DR_FS_40CNT,PEAK,10 @@ -16,6 +16,6 @@ RP_RETAIL2,DR_1003_10CNT,OFFPEAK_WEEKEND,10 RP_RETAIL2,DR_FS_10CNT,OFFPEAK_MORNING,10 RP_RETAIL2,DR_FS_10CNT,OFFPEAK_EVENING,10 RP_RETAIL2,DR_FS_10CNT,OFFPEAK_WEEKEND,10 -RP_RETAIL2,DR_1007_MAXCOST_FREE,ALWAYS,10 -RP_SPECIAL_1002,DR_SPECIAL_1002,ALWAYS,10 +RP_RETAIL2,DR_1007_MAXCOST_FREE,*any,10 +RP_SPECIAL_1002,DR_SPECIAL_1002,*any,10 RP_GENERIC,DR_GENERIC,*any,10 \ No newline at end of file diff --git a/data/tariffplans/tutorial/Timings.csv b/data/tariffplans/tutorial/Timings.csv index d5018f529..5ab820810 100644 --- a/data/tariffplans/tutorial/Timings.csv +++ b/data/tariffplans/tutorial/Timings.csv @@ -1,6 +1,4 @@ #Tag,Years,Months,MonthDays,WeekDays,Time -ALWAYS,*any,*any,*any,*any,00:00:00 -ASAP,*any,*any,*any,*any,*asap PEAK,*any,*any,*any,1;2;3;4;5,08:00:00 OFFPEAK_MORNING,*any,*any,*any,1;2;3;4;5,00:00:00 OFFPEAK_EVENING,*any,*any,*any,1;2;3;4;5,19:00:00 From 09673d4658d83f744ad78a74c92e3e2f6afecad4 Mon Sep 17 00:00:00 2001 From: Errol Samuels Date: Tue, 7 Jun 2016 12:56:44 +0100 Subject: [PATCH 10/15] Update CONTRIBUTORS.md --- CONTRIBUTORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 8359e701e..3c00699e0 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -44,6 +44,7 @@ information, please see the [`CONTRIBUTING.md`](CONTRIBUTING.md) file. | @elfranne | Tom Braarup Cuykens | | @rbarrabe | Régis Barrabé | | @J0hnSteel | John Koce Steel | +| @ewsamuels | Errol Samuels | | @razvancrainea | Răzvan Crainea |