diff --git a/apier/v1/accounts.go b/apier/v1/accounts.go index d4895fda8..58fb595be 100644 --- a/apier/v1/accounts.go +++ b/apier/v1/accounts.go @@ -43,7 +43,7 @@ func (self *ApierV1) GetAccountActionPlan(attrs utils.TenantAccount, reply *[]*A } acntID := utils.ConcatenatedKey(attrs.Tenant, attrs.Account) acntATsIf, err := guardian.Guardian.Guard(func() (interface{}, error) { - acntAPids, err := self.DataManager.DataDB().GetAccountActionPlans(acntID, false, utils.NonTransactional) + acntAPids, err := self.DataManager.GetAccountActionPlans(acntID, false, utils.NonTransactional) if err != nil && err != utils.ErrNotFound { return nil, utils.NewErrServerError(err) } @@ -183,7 +183,7 @@ func (self *ApierV1) SetAccount(attr utils.AttrSetAccount, reply *string) (err e } if attr.ActionPlanId != "" { _, err := guardian.Guardian.Guard(func() (interface{}, error) { - acntAPids, err := self.DataManager.DataDB().GetAccountActionPlans(accID, false, utils.NonTransactional) + acntAPids, err := self.DataManager.GetAccountActionPlans(accID, false, utils.NonTransactional) if err != nil && err != utils.ErrNotFound { return 0, err } diff --git a/apier/v1/dm_remote_it_test.go b/apier/v1/dm_remote_it_test.go index 54d8ca54f..b449ee4ce 100644 --- a/apier/v1/dm_remote_it_test.go +++ b/apier/v1/dm_remote_it_test.go @@ -62,6 +62,7 @@ var sTestsInternalRemoteIT = []func(t *testing.T){ testInternalRemoteITGetRatingProfile, testInternalRemoteITGetAction, testInternalRemoteITGetActionPlan, + testInternalRemoteITGetAccountActionPlan, testInternalRemoteITKillEngine, } @@ -553,6 +554,23 @@ func testInternalRemoteITGetActionPlan(t *testing.T) { } } +func testInternalRemoteITGetAccountActionPlan(t *testing.T) { + var aap []*AccountActionTiming + if err := internalRPC.Call("ApierV1.GetAccountActionPlan", + utils.TenantAccount{ + Tenant: "cgrates.org", + Account: "1001", + }, &aap); err != nil { + t.Error(err) + } else if len(aap) != 1 { + t.Errorf("Expected: %v,\n received: %v", 1, len(aap)) + } else if aap[0].ActionPlanId != "AP_PACKAGE_10" { + t.Errorf("Expected: %v,\n received: %v", "AP_PACKAGE_10", aap[0].ActionPlanId) + } else if aap[0].ActionsId != "ACT_TOPUP_RST_10" { + t.Errorf("Expected: %v,\n received: %v", "ACT_TOPUP_RST_10", aap[0].ActionsId) + } +} + func testInternalRemoteITKillEngine(t *testing.T) { if err := engine.KillEngine(100); err != nil { t.Error(err) diff --git a/apier/v2/accounts.go b/apier/v2/accounts.go index 64fa314c2..ec710b852 100644 --- a/apier/v2/accounts.go +++ b/apier/v2/accounts.go @@ -118,7 +118,7 @@ func (self *ApierV2) SetAccount(attr AttrSetAccount, reply *string) error { } if attr.ActionPlanIDs != nil { _, err := guardian.Guardian.Guard(func() (interface{}, error) { - acntAPids, err := self.DataManager.DataDB().GetAccountActionPlans(accID, false, utils.NonTransactional) + acntAPids, err := self.DataManager.GetAccountActionPlans(accID, false, utils.NonTransactional) if err != nil && err != utils.ErrNotFound { return 0, err } diff --git a/apier/v2/apierv2_it_test.go b/apier/v2/apierv2_it_test.go index 1de0d3cf9..eec7d4a0f 100644 --- a/apier/v2/apierv2_it_test.go +++ b/apier/v2/apierv2_it_test.go @@ -230,7 +230,7 @@ func TestApierV2itSetAccountWithAP(t *testing.T) { ActionPlanIDs: &[]string{argAP1.Id}, } acntID := utils.ConcatenatedKey(argSetAcnt1.Tenant, argSetAcnt1.Account) - if _, err := dm.DataDB().GetAccountActionPlans(acntID, true, utils.NonTransactional); err == nil || err != utils.ErrNotFound { + if _, err := dm.GetAccountActionPlans(acntID, true, utils.NonTransactional); err == nil || err != utils.ErrNotFound { t.Error(err) } if err := apierRPC.Call("ApierV2.SetAccount", argSetAcnt1, &reply); err != nil { @@ -242,7 +242,7 @@ func TestApierV2itSetAccountWithAP(t *testing.T) { t.Errorf("ActionPlan does not contain the accountID: %+v", ap) } eAAPids := []string{argAP1.Id} - if aapIDs, err := dm.DataDB().GetAccountActionPlans(acntID, true, utils.NonTransactional); err != nil { + if aapIDs, err := dm.GetAccountActionPlans(acntID, true, utils.NonTransactional); err != nil { t.Error(err) } else if !reflect.DeepEqual(eAAPids, aapIDs) { t.Errorf("Expecting: %+v, received: %+v", eAAPids, aapIDs) @@ -279,7 +279,7 @@ func TestApierV2itSetAccountWithAP(t *testing.T) { t.Errorf("ActionPlan does not contain the accountID: %+v", ap) } eAAPids = []string{argAP1.Id, argAP2.Id} - if aapIDs, err := dm.DataDB().GetAccountActionPlans(acntID, true, utils.NonTransactional); err != nil { + if aapIDs, err := dm.GetAccountActionPlans(acntID, true, utils.NonTransactional); err != nil { t.Error(err) } else if !reflect.DeepEqual(eAAPids, aapIDs) { t.Errorf("Expecting: %+v, received: %+v", eAAPids, aapIDs) @@ -305,7 +305,7 @@ func TestApierV2itSetAccountWithAP(t *testing.T) { t.Errorf("ActionPlan does not contain the accountID: %+v", ap) } eAAPids = []string{argAP2.Id} - if aapIDs, err := dm.DataDB().GetAccountActionPlans(acntID, true, utils.NonTransactional); err != nil { + if aapIDs, err := dm.GetAccountActionPlans(acntID, true, utils.NonTransactional); err != nil { t.Error(err) } else if !reflect.DeepEqual(eAAPids, aapIDs) { t.Errorf("Expecting: %+v, received: %+v", eAAPids, aapIDs) diff --git a/data/tariffplans/tutorial/Timings.csv b/data/tariffplans/tutorial/Timings.csv deleted file mode 100644 index 755ce3f8f..000000000 --- a/data/tariffplans/tutorial/Timings.csv +++ /dev/null @@ -1,7 +0,0 @@ -#ID,Years,Months,MonthDays,WeekDays,Time -PEAK,*any,2,1,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 -OFFPEAK_WEEKEND,*any,*any,*any,6;7,00:00:00 -NEW_YEAR,*any,1,1,*any,00:00:00 -TM_NOON,*any,*any,*any,*any,12:00:00 \ No newline at end of file diff --git a/engine/action.go b/engine/action.go index d2685cce8..18b9bd7ab 100644 --- a/engine/action.go +++ b/engine/action.go @@ -612,7 +612,7 @@ func removeAccountAction(ub *Account, a *Action, acs Actions, extraData interfac } _, err := guardian.Guardian.Guard(func() (interface{}, error) { - acntAPids, err := dm.DataDB().GetAccountActionPlans(accID, false, utils.NonTransactional) + acntAPids, err := dm.GetAccountActionPlans(accID, false, utils.NonTransactional) if err != nil && err != utils.ErrNotFound { utils.Logger.Err(fmt.Sprintf("Could not get action plans: %s: %v", accID, err)) return 0, err diff --git a/engine/actions_test.go b/engine/actions_test.go index 928f629b5..96f9126dc 100644 --- a/engine/actions_test.go +++ b/engine/actions_test.go @@ -584,7 +584,7 @@ func TestActionPlansRemoveMember(t *testing.T) { []string{account1.ID}, true); err != nil { t.Error(err) } - dm.DataDB().GetAccountActionPlans(account1.ID, true, utils.NonTransactional) // FixMe: remove here after finishing testing of map + dm.GetAccountActionPlans(account1.ID, true, utils.NonTransactional) // FixMe: remove here after finishing testing of map if err = dm.DataDB().SetAccountActionPlans(account2.ID, []string{ap2.Id}, false); err != nil { t.Error(err) diff --git a/engine/datamanager.go b/engine/datamanager.go index 7da92a04a..88f3d7846 100644 --- a/engine/datamanager.go +++ b/engine/datamanager.go @@ -240,7 +240,7 @@ func (dm *DataManager) CacheDataFromDB(prfx string, ids []string, mustBeCached b case utils.ACTION_PLAN_PREFIX: _, err = dm.GetActionPlan(dataID, true, utils.NonTransactional) case utils.AccountActionPlansPrefix: - _, err = dm.DataDB().GetAccountActionPlans(dataID, true, utils.NonTransactional) + _, err = dm.GetAccountActionPlans(dataID, true, utils.NonTransactional) case utils.ACTION_TRIGGER_PREFIX: _, err = dm.GetActionTriggers(dataID, true, utils.NonTransactional) case utils.SHARED_GROUP_PREFIX: @@ -1258,6 +1258,24 @@ func (dm *DataManager) GetAllActionPlans() (ats map[string]*ActionPlan, err erro return } +func (dm *DataManager) GetAccountActionPlans(acntID string, + skipCache bool, transactionID string) (apIDs []string, err error) { + apIDs, err = dm.dataDB.GetAccountActionPlansDrv(acntID, skipCache, transactionID) + if ((err == nil && len(apIDs) == 0) || err == utils.ErrNotFound) && len(dm.rmtDataDBs) != 0 { + var rmtErr error + for _, rmtDM := range dm.rmtDataDBs { + if apIDs, rmtErr = rmtDM.dataDB.GetAccountActionPlansDrv(acntID, skipCache, utils.NonTransactional); rmtErr == nil { + break + } + } + err = rmtErr + } + if err != nil { + return nil, err + } + return +} + func (dm *DataManager) GetRatingPlan(key string, skipCache bool, transactionID string) (rp *RatingPlan, err error) { if !skipCache { diff --git a/engine/onstor_it_test.go b/engine/onstor_it_test.go index e7e95087f..dda6aaad0 100644 --- a/engine/onstor_it_test.go +++ b/engine/onstor_it_test.go @@ -1060,13 +1060,13 @@ func testOnStorITCRUDAccountActionPlans(t *testing.T) { expect := []string{"PACKAGE_10_SHARED_A_5", "USE_SHARED_A", "apl_PACKAGE_1001"} aAPs := []string{"PACKAGE_10_SHARED_A_5", "apl_PACKAGE_1001"} aAPs2 := []string{"USE_SHARED_A"} - if _, rcvErr := onStor.DataDB().GetAccountActionPlans(acntID, true, utils.NonTransactional); rcvErr != utils.ErrNotFound { + if _, rcvErr := onStor.GetAccountActionPlans(acntID, true, utils.NonTransactional); rcvErr != utils.ErrNotFound { t.Error(rcvErr) } if err := onStor.DataDB().SetAccountActionPlans(acntID, aAPs, true); err != nil { t.Error(err) } - if rcv, err := onStor.DataDB().GetAccountActionPlans(acntID, true, utils.NonTransactional); err != nil { + if rcv, err := onStor.GetAccountActionPlans(acntID, true, utils.NonTransactional); err != nil { t.Error(err) } else if !reflect.DeepEqual(aAPs, rcv) { t.Errorf("Expecting: %v, received: %v", aAPs, rcv) @@ -1074,7 +1074,7 @@ func testOnStorITCRUDAccountActionPlans(t *testing.T) { if err := onStor.DataDB().SetAccountActionPlans(acntID, aAPs2, false); err != nil { t.Error(err) } - if rcv, err := onStor.DataDB().GetAccountActionPlans(acntID, true, utils.NonTransactional); err != nil { + if rcv, err := onStor.GetAccountActionPlans(acntID, true, utils.NonTransactional); err != nil { t.Error(err) } else if !reflect.DeepEqual(expect, rcv) { t.Errorf("Expecting: %v, received: %v", expect, rcv) @@ -1083,11 +1083,11 @@ func testOnStorITCRUDAccountActionPlans(t *testing.T) { // if err = onStor.DataDB().SelectDatabase("13"); err != nil { // t.Error(err) // } - // if _, rcvErr := onStor.DataDB().GetAccountActionPlans(acntID, false, utils.NonTransactional); rcvErr != utils.ErrNotFound { + // if _, rcvErr := onStor.GetAccountActionPlans(acntID, false, utils.NonTransactional); rcvErr != utils.ErrNotFound { // t.Error(rcvErr) // } // - if rcv, err := onStor.DataDB().GetAccountActionPlans(acntID, false, utils.NonTransactional); err != nil { + if rcv, err := onStor.GetAccountActionPlans(acntID, false, utils.NonTransactional); err != nil { t.Error(err) } else if !reflect.DeepEqual(expect, rcv) { t.Errorf("Expecting: %v, received: %v", expect, rcv) @@ -1098,7 +1098,7 @@ func testOnStorITCRUDAccountActionPlans(t *testing.T) { if err := onStor.DataDB().RemAccountActionPlans(acntID, aAPs2); err != nil { t.Error(err) } - if rcv, err := onStor.DataDB().GetAccountActionPlans(acntID, true, utils.NonTransactional); err != nil { + if rcv, err := onStor.GetAccountActionPlans(acntID, true, utils.NonTransactional); err != nil { t.Error(err) } else if !reflect.DeepEqual(aAPs, rcv) { t.Errorf("Expecting: %v, received: %v", aAPs, rcv) @@ -1106,7 +1106,7 @@ func testOnStorITCRUDAccountActionPlans(t *testing.T) { if err := onStor.DataDB().RemAccountActionPlans(acntID, aAPs); err != nil { t.Error(err) } - if _, rcvErr := onStor.DataDB().GetAccountActionPlans(acntID, true, utils.NonTransactional); rcvErr != utils.ErrNotFound { + if _, rcvErr := onStor.GetAccountActionPlans(acntID, true, utils.NonTransactional); rcvErr != utils.ErrNotFound { t.Error(rcvErr) } } diff --git a/engine/storage_interface.go b/engine/storage_interface.go index 7c12929d6..635e6e973 100644 --- a/engine/storage_interface.go +++ b/engine/storage_interface.go @@ -74,7 +74,7 @@ type DataDB interface { SetActionPlan(string, *ActionPlan, bool, string) error RemoveActionPlan(key string, transactionID string) error GetAllActionPlansDrv() (map[string]*ActionPlan, error) - GetAccountActionPlans(acntID string, skipCache bool, + GetAccountActionPlansDrv(acntID string, skipCache bool, transactionID string) (apIDs []string, err error) SetAccountActionPlans(acntID string, apIDs []string, overwrite bool) (err error) RemAccountActionPlans(acntID string, apIDs []string) (err error) diff --git a/engine/storage_internal_datadb.go b/engine/storage_internal_datadb.go index ea9dcb860..ed2a7eb3e 100644 --- a/engine/storage_internal_datadb.go +++ b/engine/storage_internal_datadb.go @@ -575,7 +575,7 @@ func (iDB *InternalDB) GetAllActionPlansDrv() (ats map[string]*ActionPlan, err e return } -func (iDB *InternalDB) GetAccountActionPlans(acntID string, +func (iDB *InternalDB) GetAccountActionPlansDrv(acntID string, skipCache bool, transactionID string) (apIDs []string, err error) { if !skipCache { if x, ok := Cache.Get(utils.CacheAccountActionPlans, acntID); ok { @@ -599,7 +599,7 @@ func (iDB *InternalDB) GetAccountActionPlans(acntID string, func (iDB *InternalDB) SetAccountActionPlans(acntID string, apIDs []string, overwrite bool) (err error) { if !overwrite { - if oldaPlIDs, err := iDB.GetAccountActionPlans(acntID, true, utils.NonTransactional); err != nil && err != utils.ErrNotFound { + if oldaPlIDs, err := iDB.GetAccountActionPlansDrv(acntID, true, utils.NonTransactional); err != nil && err != utils.ErrNotFound { return err } else { for _, oldAPid := range oldaPlIDs { @@ -621,7 +621,7 @@ func (iDB *InternalDB) RemAccountActionPlans(acntID string, apIDs []string) (err cacheCommit(utils.NonTransactional), utils.NonTransactional) return } - oldaPlIDs, err := iDB.GetAccountActionPlans(acntID, true, utils.NonTransactional) + oldaPlIDs, err := iDB.GetAccountActionPlansDrv(acntID, true, utils.NonTransactional) if err != nil { return err } diff --git a/engine/storage_map_datadb.go b/engine/storage_map_datadb.go index a2a33e562..b2889f1ed 100644 --- a/engine/storage_map_datadb.go +++ b/engine/storage_map_datadb.go @@ -663,7 +663,7 @@ func (ms *MapStorage) GetAllActionPlansDrv() (ats map[string]*ActionPlan, err er return } -func (ms *MapStorage) GetAccountActionPlans(acntID string, +func (ms *MapStorage) GetAccountActionPlansDrv(acntID string, skipCache bool, transactionID string) (apIDs []string, err error) { ms.mu.RLock() defer ms.mu.RUnlock() @@ -692,7 +692,7 @@ func (ms *MapStorage) GetAccountActionPlans(acntID string, func (ms *MapStorage) SetAccountActionPlans(acntID string, apIDs []string, overwrite bool) (err error) { if !overwrite { - if oldaPlIDs, err := ms.GetAccountActionPlans(acntID, true, utils.NonTransactional); err != nil && err != utils.ErrNotFound { + if oldaPlIDs, err := ms.GetAccountActionPlansDrv(acntID, true, utils.NonTransactional); err != nil && err != utils.ErrNotFound { return err } else { for _, oldAPid := range oldaPlIDs { @@ -719,7 +719,7 @@ func (ms *MapStorage) RemAccountActionPlans(acntID string, apIDs []string) (err delete(ms.dict, key) return } - oldaPlIDs, err := ms.GetAccountActionPlans(acntID, true, utils.NonTransactional) + oldaPlIDs, err := ms.GetAccountActionPlansDrv(acntID, true, utils.NonTransactional) if err != nil { return err } diff --git a/engine/storage_mongo_datadb.go b/engine/storage_mongo_datadb.go index 653a55438..64a061cc0 100644 --- a/engine/storage_mongo_datadb.go +++ b/engine/storage_mongo_datadb.go @@ -694,9 +694,6 @@ func (ms *MongoStorage) GetKeysForPrefix(prefix string) (result []string, err er } return err }) - if len(result) == 0 { - return nil, utils.ErrNotFound - } return } @@ -1463,7 +1460,7 @@ func (ms *MongoStorage) GetAllActionPlansDrv() (ats map[string]*ActionPlan, err return } -func (ms *MongoStorage) GetAccountActionPlans(acntID string, skipCache bool, transactionID string) (aPlIDs []string, err error) { +func (ms *MongoStorage) GetAccountActionPlansDrv(acntID string, skipCache bool, transactionID string) (aPlIDs []string, err error) { if !skipCache { if x, ok := Cache.Get(utils.CacheAccountActionPlans, acntID); ok { if x == nil { @@ -1498,7 +1495,7 @@ func (ms *MongoStorage) GetAccountActionPlans(acntID string, skipCache bool, tra func (ms *MongoStorage) SetAccountActionPlans(acntID string, aPlIDs []string, overwrite bool) (err error) { if !overwrite { - if oldaPlIDs, err := ms.GetAccountActionPlans(acntID, false, utils.NonTransactional); err != nil && err != utils.ErrNotFound { + if oldaPlIDs, err := ms.GetAccountActionPlansDrv(acntID, false, utils.NonTransactional); err != nil && err != utils.ErrNotFound { return err } else { for _, oldAPid := range oldaPlIDs { @@ -1531,7 +1528,7 @@ func (ms *MongoStorage) RemAccountActionPlans(acntID string, aPlIDs []string) (e return err }) } - oldAPlIDs, err := ms.GetAccountActionPlans(acntID, true, utils.NonTransactional) + oldAPlIDs, err := ms.GetAccountActionPlansDrv(acntID, true, utils.NonTransactional) if err != nil { return err } diff --git a/engine/storage_redis.go b/engine/storage_redis.go index 08e8d6804..59f03ffb9 100644 --- a/engine/storage_redis.go +++ b/engine/storage_redis.go @@ -996,7 +996,7 @@ func (rs *RedisStorage) GetAllActionPlansDrv() (ats map[string]*ActionPlan, err return } -func (rs *RedisStorage) GetAccountActionPlans(acntID string, skipCache bool, +func (rs *RedisStorage) GetAccountActionPlansDrv(acntID string, skipCache bool, transactionID string) (aPlIDs []string, err error) { if !skipCache { if x, ok := Cache.Get(utils.CacheAccountActionPlans, acntID); ok { @@ -1026,7 +1026,7 @@ func (rs *RedisStorage) GetAccountActionPlans(acntID string, skipCache bool, func (rs *RedisStorage) SetAccountActionPlans(acntID string, aPlIDs []string, overwrite bool) (err error) { if !overwrite { - if oldaPlIDs, err := rs.GetAccountActionPlans(acntID, true, utils.NonTransactional); err != nil && err != utils.ErrNotFound { + if oldaPlIDs, err := rs.GetAccountActionPlansDrv(acntID, true, utils.NonTransactional); err != nil && err != utils.ErrNotFound { return err } else { for _, oldAPid := range oldaPlIDs { @@ -1048,7 +1048,7 @@ func (rs *RedisStorage) RemAccountActionPlans(acntID string, aPlIDs []string) (e if len(aPlIDs) == 0 { return rs.Cmd(redis_DEL, key).Err } - oldaPlIDs, err := rs.GetAccountActionPlans(acntID, true, utils.NonTransactional) + oldaPlIDs, err := rs.GetAccountActionPlansDrv(acntID, true, utils.NonTransactional) if err != nil { return err }