diff --git a/apier/v1/accounts.go b/apier/v1/accounts.go index fc561b526..250a60747 100644 --- a/apier/v1/accounts.go +++ b/apier/v1/accounts.go @@ -47,13 +47,13 @@ func (apierSv1 *APIerSv1) GetAccountActionPlan(attrs *utils.TenantAccount, reply } acntID := utils.ConcatenatedKey(tnt, attrs.Account) acntATsIf, err := guardian.Guardian.Guard(func() (interface{}, error) { - acntAPids, err := apierSv1.DataManager.GetAccountActionPlans(acntID, false, utils.NonTransactional) + acntAPids, err := apierSv1.DataManager.GetAccountActionPlans(acntID, true, true, utils.NonTransactional) if err != nil && err != utils.ErrNotFound { return nil, utils.NewErrServerError(err) } var acntAPs []*engine.ActionPlan for _, apID := range acntAPids { - if ap, err := apierSv1.DataManager.GetActionPlan(apID, false, utils.NonTransactional); err != nil { + if ap, err := apierSv1.DataManager.GetActionPlan(apID, true, true, utils.NonTransactional); err != nil { return nil, err } else if ap != nil { acntAPs = append(acntAPs, ap) @@ -107,7 +107,7 @@ func (apierSv1 *APIerSv1) RemoveActionTiming(attrs *AttrRemoveActionTiming, repl var remAcntAPids []string // list of accounts who's indexes need modification _, err = guardian.Guardian.Guard(func() (interface{}, error) { - ap, err := apierSv1.DataManager.GetActionPlan(attrs.ActionPlanId, false, utils.NonTransactional) + ap, err := apierSv1.DataManager.GetActionPlan(attrs.ActionPlanId, true, true, utils.NonTransactional) if err != nil { return 0, err } else if ap == nil { @@ -201,7 +201,7 @@ func (apierSv1 *APIerSv1) SetAccount(attr *utils.AttrSetAccount, reply *string) } if attr.ActionPlanID != "" { _, err := guardian.Guardian.Guard(func() (interface{}, error) { - acntAPids, err := apierSv1.DataManager.GetAccountActionPlans(accID, false, utils.NonTransactional) + acntAPids, err := apierSv1.DataManager.GetAccountActionPlans(accID, true, true, utils.NonTransactional) if err != nil && err != utils.ErrNotFound { return 0, err } @@ -212,7 +212,7 @@ func (apierSv1 *APIerSv1) SetAccount(attr *utils.AttrSetAccount, reply *string) i++ // increase index since we don't remove from slice continue } - ap, err := apierSv1.DataManager.GetActionPlan(apID, false, utils.NonTransactional) + ap, err := apierSv1.DataManager.GetActionPlan(apID, true, true, utils.NonTransactional) if err != nil { return 0, err } @@ -221,7 +221,7 @@ func (apierSv1 *APIerSv1) SetAccount(attr *utils.AttrSetAccount, reply *string) acntAPids = append(acntAPids[:i], acntAPids[i+1:]...) // remove the item from the list so we can overwrite the real list } if !utils.IsSliceMember(acntAPids, attr.ActionPlanID) { // Account not yet attached to action plan, do it here - ap, err := apierSv1.DataManager.GetActionPlan(attr.ActionPlanID, false, utils.NonTransactional) + ap, err := apierSv1.DataManager.GetActionPlan(attr.ActionPlanID, true, true, utils.NonTransactional) if err != nil { return 0, err } diff --git a/apier/v1/apier.go b/apier/v1/apier.go index 73f9be199..a76d1f17e 100644 --- a/apier/v1/apier.go +++ b/apier/v1/apier.go @@ -147,12 +147,16 @@ func (apierSv1 *APIerSv1) ComputeReverseDestinations(ignr *string, reply *string } // ComputeAccountActionPlans will rebuild complete reverse accountActions data -func (apierSv1 *APIerSv1) ComputeAccountActionPlans(ignr *string, reply *string) (err error) { +func (apierSv1 *APIerSv1) ComputeAccountActionPlans(tnt *utils.TenantWithAPIOpts, reply *string) (err error) { if err = apierSv1.DataManager.RebuildReverseForPrefix(utils.AccountActionPlansPrefix); err != nil { return } - *reply = utils.OK - return + return apierSv1.ConnMgr.Call(apierSv1.Config.ApierCfg().CachesConns, nil, + utils.CacheSv1Clear, &utils.AttrCacheIDsWithAPIOpts{ + Tenant: tnt.Tenant, + CacheIDs: []string{utils.CacheAccountActionPlans}, + APIOpts: tnt.APIOpts, + }, reply) } func (apierSv1 *APIerSv1) GetSharedGroup(sgId *string, reply *engine.SharedGroup) error { @@ -763,7 +767,7 @@ func (apierSv1 *APIerSv1) SetActionPlan(attrs *AttrSetActionPlan, reply *string) } _, err = guardian.Guardian.Guard(func() (interface{}, error) { var prevAccountIDs utils.StringMap - if prevAP, err := apierSv1.DataManager.GetActionPlan(attrs.Id, false, utils.NonTransactional); err != nil && err != utils.ErrNotFound { + if prevAP, err := apierSv1.DataManager.GetActionPlan(attrs.Id, true, true, utils.NonTransactional); err != nil && err != utils.ErrNotFound { return 0, utils.NewErrServerError(err) } else if err == nil && !attrs.Overwrite { return 0, utils.ErrExists @@ -961,7 +965,7 @@ func (apierSv1 *APIerSv1) GetActionPlan(attr *AttrGetActionPlan, reply *[]*engin result = append(result, apls) } } else { - apls, err := apierSv1.DataManager.GetActionPlan(attr.ID, false, utils.NonTransactional) + apls, err := apierSv1.DataManager.GetActionPlan(attr.ID, true, true, utils.NonTransactional) if err != nil { return err } @@ -977,7 +981,7 @@ func (apierSv1 *APIerSv1) RemoveActionPlan(attr *AttrGetActionPlan, reply *strin } if _, err = guardian.Guardian.Guard(func() (interface{}, error) { var prevAccountIDs utils.StringMap - if prevAP, err := apierSv1.DataManager.GetActionPlan(attr.ID, false, utils.NonTransactional); err != nil && err != utils.ErrNotFound { + if prevAP, err := apierSv1.DataManager.GetActionPlan(attr.ID, true, true, utils.NonTransactional); err != nil && err != utils.ErrNotFound { return 0, err } else if prevAP != nil { prevAccountIDs = prevAP.AccountIDs diff --git a/apier/v1/replicator.go b/apier/v1/replicator.go index 28a862d66..a69e4578f 100644 --- a/apier/v1/replicator.go +++ b/apier/v1/replicator.go @@ -201,7 +201,7 @@ func (rplSv1 *ReplicatorSv1) GetActions(id *utils.StringWithAPIOpts, reply *engi // GetActionPlan is the remote method coresponding to the dataDb driver method func (rplSv1 *ReplicatorSv1) GetActionPlan(id *utils.StringWithAPIOpts, reply *engine.ActionPlan) error { engine.UpdateReplicationFilters(utils.ActionPlanPrefix, id.Arg, utils.IfaceAsString(id.APIOpts[utils.RemoteHostOpt])) - rcv, err := rplSv1.dm.DataDB().GetActionPlanDrv(id.Arg, true, utils.NonTransactional) + rcv, err := rplSv1.dm.DataDB().GetActionPlanDrv(id.Arg) if err != nil { return err } @@ -225,7 +225,7 @@ func (rplSv1 *ReplicatorSv1) GetAllActionPlans(id *utils.StringWithAPIOpts, repl // GetAccountActionPlans is the remote method coresponding to the dataDb driver method func (rplSv1 *ReplicatorSv1) GetAccountActionPlans(id *utils.StringWithAPIOpts, reply *[]string) error { engine.UpdateReplicationFilters(utils.AccountActionPlansPrefix, id.Arg, utils.IfaceAsString(id.APIOpts[utils.RemoteHostOpt])) - rcv, err := rplSv1.dm.DataDB().GetAccountActionPlansDrv(id.Arg, false, utils.NonTransactional) + rcv, err := rplSv1.dm.DataDB().GetAccountActionPlansDrv(id.Arg) if err != nil { return err } @@ -591,7 +591,7 @@ func (rplSv1 *ReplicatorSv1) SetDispatcherProfile(dpp *engine.DispatcherProfileW // SetActionPlan is the replication method coresponding to the dataDb driver method func (rplSv1 *ReplicatorSv1) SetActionPlan(args *engine.SetActionPlanArgWithAPIOpts, reply *string) (err error) { - if err = rplSv1.dm.DataDB().SetActionPlanDrv(args.Key, args.Ats, args.Overwrite, utils.NonTransactional); err != nil { + if err = rplSv1.dm.DataDB().SetActionPlanDrv(args.Key, args.Ats); err != nil { return } if err = rplSv1.v1.CallCache(utils.IfaceAsString(args.APIOpts[utils.CacheOpt]), @@ -604,7 +604,7 @@ func (rplSv1 *ReplicatorSv1) SetActionPlan(args *engine.SetActionPlanArgWithAPIO // SetAccountActionPlans is the replication method coresponding to the dataDb driver method func (rplSv1 *ReplicatorSv1) SetAccountActionPlans(args *engine.SetAccountActionPlansArgWithAPIOpts, reply *string) (err error) { - if err = rplSv1.dm.DataDB().SetAccountActionPlansDrv(args.AcntID, args.AplIDs, args.Overwrite); err != nil { + if err = rplSv1.dm.DataDB().SetAccountActionPlansDrv(args.AcntID, args.AplIDs); err != nil { return } if err = rplSv1.v1.CallCache(utils.IfaceAsString(args.APIOpts[utils.CacheOpt]), @@ -830,7 +830,7 @@ func (rplSv1 *ReplicatorSv1) RemoveActions(id *utils.StringWithAPIOpts, reply *s // RemoveActionPlan is the replication method coresponding to the dataDb driver method func (rplSv1 *ReplicatorSv1) RemoveActionPlan(id *utils.StringWithAPIOpts, reply *string) (err error) { - if err = rplSv1.dm.DataDB().RemoveActionPlanDrv(id.Arg, utils.NonTransactional); err != nil { + if err = rplSv1.dm.DataDB().RemoveActionPlanDrv(id.Arg); err != nil { return } if err = rplSv1.v1.CallCache(utils.IfaceAsString(id.APIOpts[utils.CacheOpt]), @@ -843,7 +843,7 @@ func (rplSv1 *ReplicatorSv1) RemoveActionPlan(id *utils.StringWithAPIOpts, reply // RemAccountActionPlans is the replication method coresponding to the dataDb driver method func (rplSv1 *ReplicatorSv1) RemAccountActionPlans(args *engine.RemAccountActionPlansArgsWithAPIOpts, reply *string) (err error) { - if err = rplSv1.dm.DataDB().RemAccountActionPlansDrv(args.AcntID, args.ApIDs); err != nil { + if err = rplSv1.dm.DataDB().RemAccountActionPlansDrv(args.AcntID); err != nil { return } if err = rplSv1.v1.CallCache(utils.IfaceAsString(args.APIOpts[utils.CacheOpt]), diff --git a/apier/v1/schedulers.go b/apier/v1/schedulers.go index 7cf138ef5..ed5840a63 100644 --- a/apier/v1/schedulers.go +++ b/apier/v1/schedulers.go @@ -46,7 +46,7 @@ func (schdSv1 *SchedulerSv1) Reload(arg *utils.CGREvent, reply *string) error { // ExecuteActions execute an actionPlan or multiple actionsPlans between a time interval func (schdSv1 *SchedulerSv1) ExecuteActions(attr *utils.AttrsExecuteActions, reply *string) error { if attr.ActionPlanID != utils.EmptyString { // execute by ActionPlanID - apl, err := schdSv1.dm.GetActionPlan(attr.ActionPlanID, false, utils.NonTransactional) + apl, err := schdSv1.dm.GetActionPlan(attr.ActionPlanID, true, true, utils.NonTransactional) if err != nil { *reply = err.Error() return err @@ -145,7 +145,7 @@ func (schdSv1 *SchedulerSv1) ExecuteActionPlans(attr *utils.AttrsExecuteActionPl } } for _, apID := range attr.ActionPlanIDs { - apl, err := schdSv1.dm.GetActionPlan(apID, false, utils.NonTransactional) + apl, err := schdSv1.dm.GetActionPlan(apID, true, true, utils.NonTransactional) if err != nil { *reply = err.Error() return err diff --git a/apier/v2/accounts.go b/apier/v2/accounts.go index bb1353757..3b1bab74d 100644 --- a/apier/v2/accounts.go +++ b/apier/v2/accounts.go @@ -147,7 +147,7 @@ func (apiv2 *APIerSv2) SetAccount(attr *AttrSetAccount, reply *string) error { } } _, err := guardian.Guardian.Guard(func() (interface{}, error) { - acntAPids, err := apiv2.DataManager.GetAccountActionPlans(accID, false, utils.NonTransactional) + acntAPids, err := apiv2.DataManager.GetAccountActionPlans(accID, true, true, utils.NonTransactional) if err != nil && err != utils.ErrNotFound { return 0, err } @@ -159,7 +159,7 @@ func (apiv2 *APIerSv2) SetAccount(attr *AttrSetAccount, reply *string) error { nAcntAPids = append(nAcntAPids, apID) continue // not removing the ones where } - ap, err := apiv2.DataManager.GetActionPlan(apID, false, utils.NonTransactional) + ap, err := apiv2.DataManager.GetActionPlan(apID, true, true, utils.NonTransactional) if err != nil { return 0, err } @@ -169,7 +169,7 @@ func (apiv2 *APIerSv2) SetAccount(attr *AttrSetAccount, reply *string) error { acntAPids = nAcntAPids } for _, apID := range attr.ActionPlanIDs { - ap, err := apiv2.DataManager.GetActionPlan(apID, false, utils.NonTransactional) + ap, err := apiv2.DataManager.GetActionPlan(apID, true, true, utils.NonTransactional) if err != nil { return 0, err } diff --git a/apier/v2/apierv2_it_test.go b/apier/v2/apierv2_it_test.go index 23166654d..f57223d95 100644 --- a/apier/v2/apierv2_it_test.go +++ b/apier/v2/apierv2_it_test.go @@ -262,7 +262,7 @@ func testAPIerSv2itSetAccountWithAP(t *testing.T) { {ActionsId: argActs1.ActionsId, Time: fmt.Sprintf("%v:%v:%v", tNow.Hour(), tNow.Minute(), tNow.Second()), // 10:4:12 Weight: 20.0}}} - if _, err := dm.GetActionPlan(argAP1.Id, true, utils.NonTransactional); err == nil || err != utils.ErrNotFound { + if _, err := dm.GetActionPlan(argAP1.Id, false, false, utils.NonTransactional); err == nil || err != utils.ErrNotFound { t.Error(err) } if err := apierRPC.Call(utils.APIerSv1SetActionPlan, &argAP1, &reply); err != nil { @@ -276,19 +276,19 @@ func testAPIerSv2itSetAccountWithAP(t *testing.T) { ActionPlanIDs: []string{argAP1.Id}, } acntID := utils.ConcatenatedKey(argSetAcnt1.Tenant, argSetAcnt1.Account) - if _, err := dm.GetAccountActionPlans(acntID, true, utils.NonTransactional); err == nil || err != utils.ErrNotFound { + if _, err := dm.GetAccountActionPlans(acntID, false, false, utils.NonTransactional); err == nil || err != utils.ErrNotFound { t.Error(err) } if err := apierRPC.Call(utils.APIerSv2SetAccount, &argSetAcnt1, &reply); err != nil { t.Fatal(err) } - if ap, err := dm.GetActionPlan(argAP1.Id, true, utils.NonTransactional); err != nil { + if ap, err := dm.GetActionPlan(argAP1.Id, false, false, utils.NonTransactional); err != nil { t.Error(err) } else if _, hasIt := ap.AccountIDs[acntID]; !hasIt { t.Errorf("ActionPlan does not contain the accountID: %+v", ap) } eAAPids := []string{argAP1.Id} - if aapIDs, err := dm.GetAccountActionPlans(acntID, true, utils.NonTransactional); err != nil { + if aapIDs, err := dm.GetAccountActionPlans(acntID, false, false, utils.NonTransactional); err != nil { t.Error(err) } else if !reflect.DeepEqual(eAAPids, aapIDs) { t.Errorf("Expecting: %+v, received: %+v", eAAPids, aapIDs) @@ -297,7 +297,7 @@ func testAPIerSv2itSetAccountWithAP(t *testing.T) { argAP2 := &v1.AttrSetActionPlan{Id: "TestAPIerSv2itSetAccountWithAP_AP_2", ActionPlan: []*v1.AttrActionPlan{ {ActionsId: argActs1.ActionsId, MonthDays: "1", Time: "00:00:00", Weight: 20.0}}} - if _, err := dm.GetActionPlan(argAP2.Id, true, utils.NonTransactional); err == nil || err != utils.ErrNotFound { + if _, err := dm.GetActionPlan(argAP2.Id, false, false, utils.NonTransactional); err == nil || err != utils.ErrNotFound { t.Error(err) } if err := apierRPC.Call(utils.APIerSv2SetActionPlan, argAP2, &reply); err != nil { @@ -314,18 +314,18 @@ func testAPIerSv2itSetAccountWithAP(t *testing.T) { if err := apierRPC.Call(utils.APIerSv2SetAccount, &argSetAcnt2, &reply); err != nil { t.Fatal(err) } - if ap, err := dm.GetActionPlan(argAP2.Id, true, utils.NonTransactional); err != nil { + if ap, err := dm.GetActionPlan(argAP2.Id, false, false, utils.NonTransactional); err != nil { t.Error(err) } else if _, hasIt := ap.AccountIDs[acntID]; !hasIt { t.Errorf("ActionPlan does not contain the accountID: %+v", ap) } - if ap, err := dm.GetActionPlan(argAP1.Id, true, utils.NonTransactional); err != nil { + if ap, err := dm.GetActionPlan(argAP1.Id, false, false, utils.NonTransactional); err != nil { t.Error(err) } else if _, hasIt := ap.AccountIDs[acntID]; !hasIt { t.Errorf("ActionPlan does not contain the accountID: %+v", ap) } eAAPids = []string{argAP1.Id, argAP2.Id} - if aapIDs, err := dm.GetAccountActionPlans(acntID, true, utils.NonTransactional); err != nil { + if aapIDs, err := dm.GetAccountActionPlans(acntID, false, false, utils.NonTransactional); err != nil { t.Error(err) } else if !reflect.DeepEqual(eAAPids, aapIDs) { t.Errorf("Expecting: %+v, received: %+v", eAAPids, aapIDs) @@ -340,18 +340,18 @@ func testAPIerSv2itSetAccountWithAP(t *testing.T) { if err := apierRPC.Call(utils.APIerSv2SetAccount, &argSetAcnt2, &reply); err != nil { t.Fatal(err) } - if ap, err := dm.GetActionPlan(argAP1.Id, true, utils.NonTransactional); err != nil { + if ap, err := dm.GetActionPlan(argAP1.Id, false, false, utils.NonTransactional); err != nil { t.Error(err) } else if _, hasIt := ap.AccountIDs[acntID]; hasIt { t.Errorf("ActionPlan does contain the accountID: %+v", ap) } - if ap, err := dm.GetActionPlan(argAP2.Id, true, utils.NonTransactional); err != nil { + if ap, err := dm.GetActionPlan(argAP2.Id, false, false, utils.NonTransactional); err != nil { t.Error(err) } else if _, hasIt := ap.AccountIDs[acntID]; !hasIt { t.Errorf("ActionPlan does not contain the accountID: %+v", ap) } eAAPids = []string{argAP2.Id} - if aapIDs, err := dm.GetAccountActionPlans(acntID, true, utils.NonTransactional); err != nil { + if aapIDs, err := dm.GetAccountActionPlans(acntID, false, false, utils.NonTransactional); err != nil { t.Error(err) } else if !reflect.DeepEqual(eAAPids, aapIDs) { t.Errorf("Expecting: %+v, received: %+v", eAAPids, aapIDs) diff --git a/dispatchers/replicator_it_test.go b/dispatchers/replicator_it_test.go index 452ece0e0..bfd95d7a4 100644 --- a/dispatchers/replicator_it_test.go +++ b/dispatchers/replicator_it_test.go @@ -1198,10 +1198,9 @@ func testDspRplAccountActionPlans(t *testing.T) { // Set AccountActionPlans var replyStr string setAccountActionPlans := &engine.SetAccountActionPlansArgWithAPIOpts{ - AplIDs: []string{"KeyAccountActionPlans"}, - Overwrite: true, - AcntID: "KeyAccountActionPlans", - Tenant: "cgrates.org", + AplIDs: []string{"KeyAccountActionPlans"}, + AcntID: "KeyAccountActionPlans", + Tenant: "cgrates.org", APIOpts: map[string]interface{}{ utils.OptsAPIKey: "repl12345", }, diff --git a/engine/action.go b/engine/action.go index 564520a55..317dbb549 100644 --- a/engine/action.go +++ b/engine/action.go @@ -557,13 +557,13 @@ func removeAccountAction(ub *Account, a *Action, acs Actions, extraData interfac } _, err := guardian.Guardian.Guard(func() (interface{}, error) { - acntAPids, err := dm.GetAccountActionPlans(accID, false, utils.NonTransactional) + acntAPids, err := dm.GetAccountActionPlans(accID, true, true, 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 } for _, apID := range acntAPids { - ap, err := dm.GetActionPlan(apID, false, utils.NonTransactional) + ap, err := dm.GetActionPlan(apID, true, true, utils.NonTransactional) if err != nil { utils.Logger.Err(fmt.Sprintf("Could not retrieve action plan: %s: %v", apID, err)) return 0, err diff --git a/engine/actions_test.go b/engine/actions_test.go index ffbf7c705..43777ef49 100644 --- a/engine/actions_test.go +++ b/engine/actions_test.go @@ -590,7 +590,7 @@ func TestActionPlansRemoveMember(t *testing.T) { []string{account1.ID}, true); err != nil { t.Error(err) } - dm.GetAccountActionPlans(account1.ID, true, utils.NonTransactional) // FixMe: remove here after finishing testing of map + dm.GetAccountActionPlans(account1.ID, false,false, utils.NonTransactional) // FixMe: remove here after finishing testing of map if err = dm.SetAccountActionPlans(account2.ID, []string{ap2.Id}, false); err != nil { t.Error(err) @@ -619,7 +619,7 @@ func TestActionPlansRemoveMember(t *testing.T) { t.Errorf("Execute Action: %v", err) } - apr, err1 := dm.GetActionPlan(ap1.Id, false, utils.NonTransactional) + apr, err1 := dm.GetActionPlan(ap1.Id, true,true, utils.NonTransactional) if err1 != nil { t.Errorf("Get action plan test: %v", err1) diff --git a/engine/calldesc_test.go b/engine/calldesc_test.go index 8cb27799c..670d522f8 100644 --- a/engine/calldesc_test.go +++ b/engine/calldesc_test.go @@ -684,7 +684,7 @@ func TestMaxSessionTimeWithAccount(t *testing.T) { } func TestMaxSessionTimeWithMaxRate(t *testing.T) { - ap, err := dm.GetActionPlan("TOPUP10_AT", false, utils.NonTransactional) + ap, err := dm.GetActionPlan("TOPUP10_AT", true, true, utils.NonTransactional) if err != nil { t.FailNow() } @@ -711,7 +711,7 @@ func TestMaxSessionTimeWithMaxRate(t *testing.T) { } func TestMaxSessionTimeWithMaxCost(t *testing.T) { - ap, _ := dm.GetActionPlan("TOPUP10_AT", false, utils.NonTransactional) + ap, _ := dm.GetActionPlan("TOPUP10_AT", true, true, utils.NonTransactional) for _, at := range ap.ActionTimings { at.accountIDs = utils.StringMap{"cgrates.org:max": true} at.Execute(nil, nil) @@ -734,7 +734,7 @@ func TestMaxSessionTimeWithMaxCost(t *testing.T) { } func TestGetMaxSessiontWithBlocker(t *testing.T) { - ap, _ := dm.GetActionPlan("BLOCK_AT", false, utils.NonTransactional) + ap, _ := dm.GetActionPlan("BLOCK_AT", true, true, utils.NonTransactional) for _, at := range ap.ActionTimings { at.accountIDs = utils.StringMap{"cgrates.org:block": true} at.Execute(nil, nil) @@ -783,7 +783,7 @@ func TestGetMaxSessiontWithBlocker(t *testing.T) { } func TestGetMaxSessiontWithBlockerEmpty(t *testing.T) { - ap, _ := dm.GetActionPlan("BLOCK_EMPTY_AT", false, utils.NonTransactional) + ap, _ := dm.GetActionPlan("BLOCK_EMPTY_AT", true, true, utils.NonTransactional) for _, at := range ap.ActionTimings { at.accountIDs = utils.StringMap{"cgrates.org:block_empty": true} at.Execute(nil, nil) @@ -832,7 +832,7 @@ func TestGetMaxSessiontWithBlockerEmpty(t *testing.T) { } func TestGetCostWithMaxCost(t *testing.T) { - ap, _ := dm.GetActionPlan("TOPUP10_AT", false, utils.NonTransactional) + ap, _ := dm.GetActionPlan("TOPUP10_AT", true, true, utils.NonTransactional) for _, at := range ap.ActionTimings { at.accountIDs = utils.StringMap{"cgrates.org:max": true} at.Execute(nil, nil) @@ -855,7 +855,7 @@ func TestGetCostWithMaxCost(t *testing.T) { } func TestGetCostRoundingIssue(t *testing.T) { - ap, _ := dm.GetActionPlan("TOPUP10_AT", false, utils.NonTransactional) + ap, _ := dm.GetActionPlan("TOPUP10_AT", true, true, utils.NonTransactional) for _, at := range ap.ActionTimings { at.accountIDs = utils.StringMap{"cgrates.org:dy": true} at.Execute(nil, nil) @@ -879,7 +879,7 @@ func TestGetCostRoundingIssue(t *testing.T) { } func TestGetCostRatingInfoOnZeroTime(t *testing.T) { - ap, _ := dm.GetActionPlan("TOPUP10_AT", false, utils.NonTransactional) + ap, _ := dm.GetActionPlan("TOPUP10_AT", true, true, utils.NonTransactional) for _, at := range ap.ActionTimings { at.accountIDs = utils.StringMap{"cgrates.org:dy": true} at.Execute(nil, nil) @@ -906,7 +906,7 @@ func TestGetCostRatingInfoOnZeroTime(t *testing.T) { } func TestDebitRatingInfoOnZeroTime(t *testing.T) { - ap, _ := dm.GetActionPlan("TOPUP10_AT", false, utils.NonTransactional) + ap, _ := dm.GetActionPlan("TOPUP10_AT", true, true, utils.NonTransactional) for _, at := range ap.ActionTimings { at.accountIDs = utils.StringMap{"cgrates.org:dy": true} at.Execute(nil, nil) @@ -934,7 +934,7 @@ func TestDebitRatingInfoOnZeroTime(t *testing.T) { } func TestMaxDebitRatingInfoOnZeroTime(t *testing.T) { - ap, _ := dm.GetActionPlan("TOPUP10_AT", false, utils.NonTransactional) + ap, _ := dm.GetActionPlan("TOPUP10_AT", true, true, utils.NonTransactional) for _, at := range ap.ActionTimings { at.accountIDs = utils.StringMap{"cgrates.org:dy": true} at.Execute(nil, nil) @@ -961,7 +961,7 @@ func TestMaxDebitRatingInfoOnZeroTime(t *testing.T) { } func TestMaxDebitUnknowDest(t *testing.T) { - ap, _ := dm.GetActionPlan("TOPUP10_AT", false, utils.NonTransactional) + ap, _ := dm.GetActionPlan("TOPUP10_AT", true, true, utils.NonTransactional) for _, at := range ap.ActionTimings { at.accountIDs = utils.StringMap{"cgrates.org:dy": true} at.Execute(nil, nil) @@ -983,7 +983,7 @@ func TestMaxDebitUnknowDest(t *testing.T) { } func TestMaxDebitRoundingIssue(t *testing.T) { - ap, _ := dm.GetActionPlan("TOPUP10_AT", false, utils.NonTransactional) + ap, _ := dm.GetActionPlan("TOPUP10_AT", true, true, utils.NonTransactional) for _, at := range ap.ActionTimings { at.accountIDs = utils.StringMap{"cgrates.org:dy": true} at.Execute(nil, nil) @@ -1017,7 +1017,7 @@ func TestMaxDebitRoundingIssue(t *testing.T) { } func TestDebitRoundingRefund(t *testing.T) { - ap, _ := dm.GetActionPlan("TOPUP10_AT", false, utils.NonTransactional) + ap, _ := dm.GetActionPlan("TOPUP10_AT", true, true, utils.NonTransactional) for _, at := range ap.ActionTimings { at.accountIDs = utils.StringMap{"cgrates.org:dy": true} at.Execute(nil, nil) @@ -1051,7 +1051,7 @@ func TestDebitRoundingRefund(t *testing.T) { } func TestMaxSessionTimeWithMaxCostFree(t *testing.T) { - ap, _ := dm.GetActionPlan("TOPUP10_AT", false, utils.NonTransactional) + ap, _ := dm.GetActionPlan("TOPUP10_AT", true, true, utils.NonTransactional) for _, at := range ap.ActionTimings { at.accountIDs = utils.StringMap{"cgrates.org:max": true} at.Execute(nil, nil) @@ -1074,7 +1074,7 @@ func TestMaxSessionTimeWithMaxCostFree(t *testing.T) { } func TestMaxDebitWithMaxCostFree(t *testing.T) { - ap, _ := dm.GetActionPlan("TOPUP10_AT", false, utils.NonTransactional) + ap, _ := dm.GetActionPlan("TOPUP10_AT", true, true, utils.NonTransactional) for _, at := range ap.ActionTimings { at.accountIDs = utils.StringMap{"cgrates.org:max": true} at.Execute(nil, nil) @@ -1097,7 +1097,7 @@ func TestMaxDebitWithMaxCostFree(t *testing.T) { } func TestGetCostWithMaxCostFree(t *testing.T) { - ap, _ := dm.GetActionPlan("TOPUP10_AT", false, utils.NonTransactional) + ap, _ := dm.GetActionPlan("TOPUP10_AT", true, true, utils.NonTransactional) for _, at := range ap.ActionTimings { at.accountIDs = utils.StringMap{"cgrates.org:max": true} at.Execute(nil, nil) @@ -1121,12 +1121,12 @@ func TestGetCostWithMaxCostFree(t *testing.T) { } func TestMaxSessionTimeWithAccountShared(t *testing.T) { - ap, _ := dm.GetActionPlan("TOPUP_SHARED0_AT", false, utils.NonTransactional) + ap, _ := dm.GetActionPlan("TOPUP_SHARED0_AT", true, true, utils.NonTransactional) for _, at := range ap.ActionTimings { at.accountIDs = utils.StringMap{"vdf:empty0": true} at.Execute(nil, nil) } - ap, _ = dm.GetActionPlan("TOPUP_SHARED10_AT", false, utils.NonTransactional) + ap, _ = dm.GetActionPlan("TOPUP_SHARED10_AT", true, true, utils.NonTransactional) for _, at := range ap.ActionTimings { at.accountIDs = utils.StringMap{"vdf:empty10": true} at.Execute(nil, nil) @@ -1160,12 +1160,12 @@ func TestMaxSessionTimeWithAccountShared(t *testing.T) { } func TestMaxDebitWithAccountShared(t *testing.T) { - ap, _ := dm.GetActionPlan("TOPUP_SHARED0_AT", false, utils.NonTransactional) + ap, _ := dm.GetActionPlan("TOPUP_SHARED0_AT", true, true, utils.NonTransactional) for _, at := range ap.ActionTimings { at.accountIDs = utils.StringMap{"vdf:empty0": true} at.Execute(nil, nil) } - ap, _ = dm.GetActionPlan("TOPUP_SHARED10_AT", false, utils.NonTransactional) + ap, _ = dm.GetActionPlan("TOPUP_SHARED10_AT", true, true, utils.NonTransactional) for _, at := range ap.ActionTimings { at.accountIDs = utils.StringMap{"vdf:empty10": true} at.Execute(nil, nil) @@ -1376,7 +1376,7 @@ func TestMaxSesionTimeLongerThanMoney(t *testing.T) { } func TestDebitFromShareAndNormal(t *testing.T) { - ap, _ := dm.GetActionPlan("TOPUP_SHARED10_AT", false, utils.NonTransactional) + ap, _ := dm.GetActionPlan("TOPUP_SHARED10_AT", true, true, utils.NonTransactional) for _, at := range ap.ActionTimings { at.accountIDs = utils.StringMap{"vdf:empty10": true} at.Execute(nil, nil) @@ -1404,7 +1404,7 @@ func TestDebitFromShareAndNormal(t *testing.T) { } func TestDebitFromEmptyShare(t *testing.T) { - ap, _ := dm.GetActionPlan("TOPUP_EMPTY_AT", false, utils.NonTransactional) + ap, _ := dm.GetActionPlan("TOPUP_EMPTY_AT", true, true, utils.NonTransactional) for _, at := range ap.ActionTimings { at.accountIDs = utils.StringMap{"vdf:emptyX": true} at.Execute(nil, nil) @@ -1432,7 +1432,7 @@ func TestDebitFromEmptyShare(t *testing.T) { } func TestDebitNegatve(t *testing.T) { - ap, _ := dm.GetActionPlan("POST_AT", false, utils.NonTransactional) + ap, _ := dm.GetActionPlan("POST_AT", true, true, utils.NonTransactional) for _, at := range ap.ActionTimings { at.accountIDs = utils.StringMap{"vdf:post": true} at.Execute(nil, nil) @@ -1471,7 +1471,7 @@ func TestDebitNegatve(t *testing.T) { } func TestMaxDebitZeroDefinedRate(t *testing.T) { - ap, _ := dm.GetActionPlan("TOPUP10_AT", false, utils.NonTransactional) + ap, _ := dm.GetActionPlan("TOPUP10_AT", true, true, utils.NonTransactional) for _, at := range ap.ActionTimings { at.accountIDs = utils.StringMap{"cgrates.org:12345": true} at.Execute(nil, nil) @@ -1500,7 +1500,7 @@ func TestMaxDebitZeroDefinedRate(t *testing.T) { } func TestMaxDebitForceDuration(t *testing.T) { - ap, _ := dm.GetActionPlan("TOPUP10_AT", false, utils.NonTransactional) + ap, _ := dm.GetActionPlan("TOPUP10_AT", true, true, utils.NonTransactional) for _, at := range ap.ActionTimings { at.accountIDs = utils.StringMap{"cgrates.org:12345": true} at.Execute(nil, nil) @@ -1524,7 +1524,7 @@ func TestMaxDebitForceDuration(t *testing.T) { } func TestMaxDebitZeroDefinedRateOnlyMinutes(t *testing.T) { - ap, _ := dm.GetActionPlan("TOPUP10_AT", false, utils.NonTransactional) + ap, _ := dm.GetActionPlan("TOPUP10_AT", true, true, utils.NonTransactional) for _, at := range ap.ActionTimings { at.accountIDs = utils.StringMap{"cgrates.org:12345": true} at.Execute(nil, nil) @@ -1552,7 +1552,7 @@ func TestMaxDebitZeroDefinedRateOnlyMinutes(t *testing.T) { } func TestMaxDebitConsumesMinutes(t *testing.T) { - ap, _ := dm.GetActionPlan("TOPUP10_AT", false, utils.NonTransactional) + ap, _ := dm.GetActionPlan("TOPUP10_AT", true, true, utils.NonTransactional) for _, at := range ap.ActionTimings { at.accountIDs = utils.StringMap{"cgrates.org:12345": true} at.Execute(nil, nil) diff --git a/engine/datadbmock.go b/engine/datadbmock.go index e43306ec0..7f801d162 100644 --- a/engine/datadbmock.go +++ b/engine/datadbmock.go @@ -162,15 +162,15 @@ func (dbM *DataDBMock) RemoveActionTriggersDrv(string) error { return utils.ErrNotImplemented } -func (dbM *DataDBMock) GetActionPlanDrv(string, bool, string) (*ActionPlan, error) { +func (dbM *DataDBMock) GetActionPlanDrv(string) (*ActionPlan, error) { return nil, utils.ErrNotImplemented } -func (dbM *DataDBMock) SetActionPlanDrv(string, *ActionPlan, bool, string) error { +func (dbM *DataDBMock) SetActionPlanDrv(string, *ActionPlan) error { return utils.ErrNotImplemented } -func (dbM *DataDBMock) RemoveActionPlanDrv(key string, transactionID string) error { +func (dbM *DataDBMock) RemoveActionPlanDrv(key string) error { return utils.ErrNotImplemented } @@ -178,16 +178,15 @@ func (dbM *DataDBMock) GetAllActionPlansDrv() (map[string]*ActionPlan, error) { return nil, utils.ErrNotImplemented } -func (dbM *DataDBMock) GetAccountActionPlansDrv(acntID string, skipCache bool, - transactionID string) (apIDs []string, err error) { +func (dbM *DataDBMock) GetAccountActionPlansDrv(acntID string) (apIDs []string, err error) { return nil, utils.ErrNotImplemented } -func (dbM *DataDBMock) SetAccountActionPlansDrv(acntID string, apIDs []string, overwrite bool) (err error) { +func (dbM *DataDBMock) SetAccountActionPlansDrv(acntID string, apIDs []string) (err error) { return utils.ErrNotImplemented } -func (dbM *DataDBMock) RemAccountActionPlansDrv(acntID string, apIDs []string) (err error) { +func (dbM *DataDBMock) RemAccountActionPlansDrv(acntID string) (err error) { return utils.ErrNotImplemented } diff --git a/engine/datamanager.go b/engine/datamanager.go index 5037a357e..6bb669d75 100644 --- a/engine/datamanager.go +++ b/engine/datamanager.go @@ -153,9 +153,9 @@ func (dm *DataManager) CacheDataFromDB(prfx string, ids []string, mustBeCached b case utils.ActionPrefix: _, err = dm.GetActions(dataID, true, utils.NonTransactional) case utils.ActionPlanPrefix: - _, err = dm.GetActionPlan(dataID, true, utils.NonTransactional) + _, err = dm.GetActionPlan(dataID, false, true, utils.NonTransactional) case utils.AccountActionPlansPrefix: - _, err = dm.GetAccountActionPlans(dataID, true, utils.NonTransactional) + _, err = dm.GetAccountActionPlans(dataID, false, true, utils.NonTransactional) case utils.ActionTriggerPrefix: _, err = dm.GetActionTriggers(dataID, true, utils.NonTransactional) case utils.SharedGroupPrefix: @@ -298,15 +298,20 @@ func (dm *DataManager) RebuildReverseForPrefix(prefix string) (err error) { if keys, err = dm.dataDB.GetKeysForPrefix(utils.ActionPlanPrefix); err != nil { return } + accIDs := make(map[string][]string) for _, key := range keys { var apl *ActionPlan - if apl, err = dm.GetActionPlan(key[len(utils.ActionPlanPrefix):], true, utils.NonTransactional); err != nil { - return err + if apl, err = dm.GetActionPlan(key[len(utils.ActionPlanPrefix):], + true, false, utils.NonTransactional); err != nil { + return } for acntID := range apl.AccountIDs { - if err = dm.SetAccountActionPlans(acntID, []string{apl.Id}, false); err != nil { - return err - } + accIDs[acntID] = append(accIDs[acntID], apl.Id) + } + } + for acntID, apIDs := range accIDs { + if err = dm.SetAccountActionPlans(acntID, apIDs, true); err != nil { + return } } default: @@ -1639,9 +1644,9 @@ func (dm *DataManager) RemoveActionTriggers(id, transactionID string) (err error if err = dm.DataDB().RemoveActionTriggersDrv(id); err != nil { return } - if errCh := Cache.Remove(utils.CacheActionTriggers, id, - cacheCommit(transactionID), transactionID); errCh != nil { - return errCh + if err = Cache.Remove(utils.CacheActionTriggers, id, + cacheCommit(transactionID), transactionID); err != nil { + return } if itm := config.CgrConfig().DataDbCfg().Items[utils.MetaActionTriggers]; itm.Replicate { replicate(dm.connMgr, config.CgrConfig().DataDbCfg().RplConns, @@ -1885,38 +1890,62 @@ func (dm *DataManager) RemoveActions(key string) (err error) { return } -func (dm *DataManager) GetActionPlan(key string, skipCache bool, transactionID string) (ats *ActionPlan, err error) { +func (dm *DataManager) GetActionPlan(key string, cacheRead, cacheWrite bool, transactionID string) (ats *ActionPlan, err error) { + if cacheRead { + if x, err := Cache.GetCloned(utils.CacheActionPlans, key); err != nil { + if err != ltcache.ErrNotFound { // Only consider cache if item was found + return nil, err + } + } else if x == nil { // item was placed nil in cache + return nil, utils.ErrNotFound + } else { + return x.(*ActionPlan), nil + } + } if dm == nil { err = utils.ErrNoDatabaseConn return } - ats, err = dm.dataDB.GetActionPlanDrv(key, skipCache, transactionID) - if itm := config.CgrConfig().DataDbCfg().Items[utils.MetaActionPlans]; err == utils.ErrNotFound && itm.Remote { - if err = dm.connMgr.Call(config.CgrConfig().DataDbCfg().RmtConns, nil, - utils.ReplicatorSv1GetActionPlan, &utils.StringWithAPIOpts{ - Arg: key, - Tenant: config.CgrConfig().GeneralCfg().DefaultTenant, - APIOpts: utils.GenerateDBItemOpts(itm.APIKey, itm.RouteID, utils.EmptyString, - utils.FirstNonEmpty(config.CgrConfig().DataDbCfg().RmtConnID, - config.CgrConfig().GeneralCfg().NodeID)), - }, &ats); err == nil { - err = dm.dataDB.SetActionPlanDrv(key, ats, true, utils.NonTransactional) + + ats, err = dm.dataDB.GetActionPlanDrv(key) + if err != nil { + if itm := config.CgrConfig().DataDbCfg().Items[utils.MetaActionPlans]; err == utils.ErrNotFound && itm.Remote { + if err = dm.connMgr.Call(config.CgrConfig().DataDbCfg().RmtConns, nil, + utils.ReplicatorSv1GetActionPlan, &utils.StringWithAPIOpts{ + Arg: key, + Tenant: config.CgrConfig().GeneralCfg().DefaultTenant, + APIOpts: utils.GenerateDBItemOpts(itm.APIKey, itm.RouteID, utils.EmptyString, + utils.FirstNonEmpty(config.CgrConfig().DataDbCfg().RmtConnID, + config.CgrConfig().GeneralCfg().NodeID)), + }, &ats); err == nil { + err = dm.dataDB.SetActionPlanDrv(key, ats) + } + } + if err != nil { + err = utils.CastRPCErr(err) + if err == utils.ErrNotFound && cacheWrite { + if errCh := Cache.Set(utils.CacheActionPlans, key, nil, nil, + cacheCommit(transactionID), transactionID); errCh != nil { + return nil, errCh + } + } + return nil, err } } - if err != nil { - err = utils.CastRPCErr(err) - return nil, err + + if cacheWrite { + err = Cache.Set(utils.CacheActionPlans, key, ats, nil, + cacheCommit(transactionID), transactionID) } return } // SetActionPlanArgWithAPIOpts is used in replicatorV1 for dispatcher type SetActionPlanArgWithAPIOpts struct { - Key string - Ats *ActionPlan - Overwrite bool - Tenant string - APIOpts map[string]interface{} + Key string + Ats *ActionPlan + Tenant string + APIOpts map[string]interface{} } func (dm *DataManager) SetActionPlan(key string, ats *ActionPlan, @@ -1924,7 +1953,22 @@ func (dm *DataManager) SetActionPlan(key string, ats *ActionPlan, if dm == nil { return utils.ErrNoDatabaseConn } - if err = dm.dataDB.SetActionPlanDrv(key, ats, overwrite, transactionID); err != nil { + if len(ats.ActionTimings) == 0 { // special case to keep the old style + return dm.RemoveActionPlan(key, transactionID) + } + if !overwrite { + // get existing action plan to merge the account ids + if oldAP, _ := dm.GetActionPlan(key, true, true, transactionID); oldAP != nil { + if ats.AccountIDs == nil && len(oldAP.AccountIDs) > 0 { + ats.AccountIDs = make(utils.StringMap) + } + for accID := range oldAP.AccountIDs { + ats.AccountIDs[accID] = true + } + } + } + + if err = dm.dataDB.SetActionPlanDrv(key, ats); err != nil { return } if itm := config.CgrConfig().DataDbCfg().Items[utils.MetaActionPlans]; itm.Replicate { @@ -1933,10 +1977,9 @@ func (dm *DataManager) SetActionPlan(key string, ats *ActionPlan, utils.ActionPlanPrefix, key, // this are used to get the host IDs from cache utils.ReplicatorSv1SetActionPlan, &SetActionPlanArgWithAPIOpts{ - Key: key, - Ats: ats, - Overwrite: overwrite, - Tenant: config.CgrConfig().GeneralCfg().DefaultTenant, + Key: key, + Ats: ats, + Tenant: config.CgrConfig().GeneralCfg().DefaultTenant, APIOpts: utils.GenerateDBItemOpts(itm.APIKey, itm.RouteID, config.CgrConfig().DataDbCfg().RplCache, utils.EmptyString)}) } @@ -1971,7 +2014,7 @@ func (dm *DataManager) RemoveActionPlan(key string, transactionID string) (err e if dm == nil { return utils.ErrNoDatabaseConn } - if err = dm.dataDB.RemoveActionPlanDrv(key, transactionID); err != nil { + if err = dm.dataDB.RemoveActionPlanDrv(key); err != nil { return } if itm := config.CgrConfig().DataDbCfg().Items[utils.MetaActionPlans]; itm.Replicate { @@ -1987,47 +2030,78 @@ func (dm *DataManager) RemoveActionPlan(key string, transactionID string) (err e } return } -func (dm *DataManager) GetAccountActionPlans(acntID string, - skipCache bool, transactionID string) (apIDs []string, err error) { +func (dm *DataManager) GetAccountActionPlans(acntID string, cacheRead, cacheWrite bool, transactionID string) (apIDs []string, err error) { + if cacheRead { + if x, ok := Cache.Get(utils.CacheAccountActionPlans, acntID); ok { + if x == nil { + return nil, utils.ErrNotFound + } + return x.([]string), nil + } + } if dm == nil { err = utils.ErrNoDatabaseConn return } - apIDs, err = dm.dataDB.GetAccountActionPlansDrv(acntID, skipCache, transactionID) - if itm := config.CgrConfig().DataDbCfg().Items[utils.MetaAccountActionPlans]; ((err == nil && len(apIDs) == 0) || err == utils.ErrNotFound) && itm.Remote { - if err = dm.connMgr.Call(config.CgrConfig().DataDbCfg().RmtConns, nil, - utils.ReplicatorSv1GetAccountActionPlans, - &utils.StringWithAPIOpts{ - Arg: acntID, - Tenant: config.CgrConfig().GeneralCfg().DefaultTenant, - APIOpts: utils.GenerateDBItemOpts(itm.APIKey, itm.RouteID, utils.EmptyString, - utils.FirstNonEmpty(config.CgrConfig().DataDbCfg().RmtConnID, - config.CgrConfig().GeneralCfg().NodeID)), - }, &apIDs); err == nil { - err = dm.dataDB.SetAccountActionPlansDrv(acntID, apIDs, true) + apIDs, err = dm.dataDB.GetAccountActionPlansDrv(acntID) + if err != nil { + if itm := config.CgrConfig().DataDbCfg().Items[utils.MetaAccountActionPlans]; err == utils.ErrNotFound && itm.Remote { + if err = dm.connMgr.Call(config.CgrConfig().DataDbCfg().RmtConns, nil, + utils.ReplicatorSv1GetAccountActionPlans, + &utils.StringWithAPIOpts{ + Arg: acntID, + Tenant: config.CgrConfig().GeneralCfg().DefaultTenant, + APIOpts: utils.GenerateDBItemOpts(itm.APIKey, itm.RouteID, utils.EmptyString, + utils.FirstNonEmpty(config.CgrConfig().DataDbCfg().RmtConnID, + config.CgrConfig().GeneralCfg().NodeID)), + }, &apIDs); err == nil { + err = dm.dataDB.SetAccountActionPlansDrv(acntID, apIDs) + } + } + if err != nil { + err = utils.CastRPCErr(err) + if err == utils.ErrNotFound && cacheWrite { + if errCh := Cache.Set(utils.CacheAccountActionPlans, acntID, nil, nil, + cacheCommit(transactionID), transactionID); errCh != nil { + return nil, errCh + } + } + return nil, err } } - if err != nil { - err = utils.CastRPCErr(err) - return nil, err + if cacheWrite { + err = Cache.Set(utils.CacheAccountActionPlans, acntID, apIDs, nil, + cacheCommit(transactionID), transactionID) } return } //SetAccountActionPlansArgWithAPIOpts is used to send the key and the Actions to replicator type SetAccountActionPlansArgWithAPIOpts struct { - AcntID string - AplIDs []string - Overwrite bool - Tenant string - APIOpts map[string]interface{} + AcntID string + AplIDs []string + Tenant string + APIOpts map[string]interface{} } func (dm *DataManager) SetAccountActionPlans(acntID string, aPlIDs []string, overwrite bool) (err error) { if dm == nil { return utils.ErrNoDatabaseConn } - if err = dm.dataDB.SetAccountActionPlansDrv(acntID, aPlIDs, overwrite); err != nil { + if !overwrite { + var oldaPlIDs []string + if oldaPlIDs, err = dm.GetAccountActionPlans(acntID, + true, false, utils.NonTransactional); err != nil && err != utils.ErrNotFound { + return + } + for _, oldAPid := range oldaPlIDs { + if !utils.IsSliceMember(aPlIDs, oldAPid) { + aPlIDs = append(aPlIDs, oldAPid) + } + } + } + + if err = dm.dataDB.SetAccountActionPlansDrv(acntID, aPlIDs); err != nil { return } if itm := config.CgrConfig().DataDbCfg().Items[utils.MetaAccountActionPlans]; itm.Replicate { @@ -2036,10 +2110,9 @@ func (dm *DataManager) SetAccountActionPlans(acntID string, aPlIDs []string, ove utils.AccountActionPlansPrefix, acntID, // this are used to get the host IDs from cache utils.ReplicatorSv1SetAccountActionPlans, &SetAccountActionPlansArgWithAPIOpts{ - AcntID: acntID, - AplIDs: aPlIDs, - Overwrite: overwrite, - Tenant: config.CgrConfig().GeneralCfg().DefaultTenant, + AcntID: acntID, + AplIDs: aPlIDs, + Tenant: config.CgrConfig().GeneralCfg().DefaultTenant, APIOpts: utils.GenerateDBItemOpts(itm.APIKey, itm.RouteID, config.CgrConfig().DataDbCfg().RplCache, utils.EmptyString)}) } @@ -2058,7 +2131,22 @@ func (dm *DataManager) RemAccountActionPlans(acntID string, apIDs []string) (err if dm == nil { return utils.ErrNoDatabaseConn } - if err = dm.dataDB.RemAccountActionPlansDrv(acntID, apIDs); err != nil { + if len(apIDs) != 0 { // special case to keep the old style + var oldAAP []string + if oldAAP, err = dm.GetAccountActionPlans(acntID, true, false, utils.NonTransactional); err != nil { + return + } + remainAAP := make([]string, 0, len(oldAAP)) + for _, ap := range oldAAP { + if !utils.IsSliceMember(apIDs, ap) { + remainAAP = append(remainAAP, ap) + } + } + if len(remainAAP) != 0 { + return dm.SetAccountActionPlans(acntID, remainAAP, true) + } + } + if err = dm.dataDB.RemAccountActionPlansDrv(acntID); err != nil { return } if itm := config.CgrConfig().DataDbCfg().Items[utils.MetaAccountActionPlans]; itm.Replicate { diff --git a/engine/storage_interface.go b/engine/storage_interface.go index 0f89290e7..299c7006b 100644 --- a/engine/storage_interface.go +++ b/engine/storage_interface.go @@ -68,14 +68,13 @@ type DataDB interface { GetActionTriggersDrv(string) (ActionTriggers, error) SetActionTriggersDrv(string, ActionTriggers) error RemoveActionTriggersDrv(string) error - GetActionPlanDrv(string, bool, string) (*ActionPlan, error) - SetActionPlanDrv(string, *ActionPlan, bool, string) error - RemoveActionPlanDrv(key string, transactionID string) error + GetActionPlanDrv(string) (*ActionPlan, error) + SetActionPlanDrv(string, *ActionPlan) error + RemoveActionPlanDrv(key string) error GetAllActionPlansDrv() (map[string]*ActionPlan, error) - GetAccountActionPlansDrv(acntID string, skipCache bool, - transactionID string) (apIDs []string, err error) - SetAccountActionPlansDrv(acntID string, apIDs []string, overwrite bool) (err error) - RemAccountActionPlansDrv(acntID string, apIDs []string) (err error) + GetAccountActionPlansDrv(acntID string) (apIDs []string, err error) + SetAccountActionPlansDrv(acntID string, apIDs []string) (err error) + RemAccountActionPlansDrv(acntID string) (err error) PushTask(*Task) error PopTask() (*Task, error) GetAccountDrv(string) (*Account, error) diff --git a/engine/storage_internal_datadb.go b/engine/storage_internal_datadb.go index 9a73453ff..b82404257 100644 --- a/engine/storage_internal_datadb.go +++ b/engine/storage_internal_datadb.go @@ -104,7 +104,7 @@ func (iDB *InternalDB) RemoveKeysForPrefix(prefix string) (err error) { } for _, key := range keys { Cache.RemoveWithoutReplicate(utils.CacheReverseDestinations, key, - cacheCommit(utils.NonTransactional), utils.NonTransactional) + true, utils.NonTransactional) } return } @@ -133,7 +133,7 @@ func (iDB *InternalDB) SetVersions(vrs Versions, overwrite bool) (err error) { x, ok := Cache.Get(utils.CacheVersions, utils.VersionName) if !ok || x == nil { Cache.SetWithoutReplicate(utils.CacheVersions, utils.VersionName, vrs, nil, - cacheCommit(utils.NonTransactional), utils.NonTransactional) + true, utils.NonTransactional) return } provVrs := x.(Versions) @@ -141,7 +141,7 @@ func (iDB *InternalDB) SetVersions(vrs Versions, overwrite bool) (err error) { provVrs[key] = val } Cache.SetWithoutReplicate(utils.CacheVersions, utils.VersionName, provVrs, nil, - cacheCommit(utils.NonTransactional), utils.NonTransactional) + true, utils.NonTransactional) return } @@ -157,11 +157,11 @@ func (iDB *InternalDB) RemoveVersions(vrs Versions) (err error) { delete(internalVersions, key) } Cache.SetWithoutReplicate(utils.CacheVersions, utils.VersionName, internalVersions, nil, - cacheCommit(utils.NonTransactional), utils.NonTransactional) + true, utils.NonTransactional) return } Cache.RemoveWithoutReplicate(utils.CacheVersions, utils.VersionName, - cacheCommit(utils.NonTransactional), utils.NonTransactional) + true, utils.NonTransactional) return } @@ -205,13 +205,13 @@ func (iDB *InternalDB) GetRatingPlanDrv(id string) (rp *RatingPlan, err error) { func (iDB *InternalDB) SetRatingPlanDrv(rp *RatingPlan) (err error) { Cache.SetWithoutReplicate(utils.CacheRatingPlans, rp.Id, rp, nil, - cacheCommit(utils.NonTransactional), utils.NonTransactional) + true, utils.NonTransactional) return } func (iDB *InternalDB) RemoveRatingPlanDrv(id string) (err error) { Cache.RemoveWithoutReplicate(utils.CacheRatingPlans, id, - cacheCommit(utils.NonTransactional), utils.NonTransactional) + true, utils.NonTransactional) return } @@ -225,13 +225,13 @@ func (iDB *InternalDB) GetRatingProfileDrv(id string) (rp *RatingProfile, err er func (iDB *InternalDB) SetRatingProfileDrv(rp *RatingProfile) (err error) { Cache.SetWithoutReplicate(utils.CacheRatingProfiles, rp.Id, rp, nil, - cacheCommit(utils.NonTransactional), utils.NonTransactional) + true, utils.NonTransactional) return } func (iDB *InternalDB) RemoveRatingProfileDrv(id string) (err error) { Cache.RemoveWithoutReplicate(utils.CacheRatingProfiles, id, - cacheCommit(utils.NonTransactional), utils.NonTransactional) + true, utils.NonTransactional) return } @@ -244,7 +244,7 @@ func (iDB *InternalDB) GetDestinationDrv(key, _ string) (dest *Destination, err func (iDB *InternalDB) SetDestinationDrv(dest *Destination, transactionID string) (err error) { Cache.SetWithoutReplicate(utils.CacheDestinations, dest.Id, dest, nil, - cacheCommit(utils.NonTransactional), utils.NonTransactional) + true, utils.NonTransactional) return } @@ -287,7 +287,7 @@ func (iDB *InternalDB) SetReverseDestinationDrv(destID string, prefixes []string mpRevDst.Add(destID) // for ReverseDestination we will use Groups Cache.SetWithoutReplicate(utils.CacheReverseDestinations, p, mpRevDst.AsSlice(), nil, - cacheCommit(utils.NonTransactional), utils.NonTransactional) + true, utils.NonTransactional) } return } @@ -310,13 +310,13 @@ func (iDB *InternalDB) GetActionsDrv(id string) (acts Actions, err error) { func (iDB *InternalDB) SetActionsDrv(id string, acts Actions) (err error) { Cache.SetWithoutReplicate(utils.CacheActions, id, acts, nil, - cacheCommit(utils.NonTransactional), utils.NonTransactional) + true, utils.NonTransactional) return } func (iDB *InternalDB) RemoveActionsDrv(id string) (err error) { Cache.RemoveWithoutReplicate(utils.CacheActions, id, - cacheCommit(utils.NonTransactional), utils.NonTransactional) + true, utils.NonTransactional) return } @@ -329,13 +329,13 @@ func (iDB *InternalDB) GetSharedGroupDrv(id string) (sh *SharedGroup, err error) func (iDB *InternalDB) SetSharedGroupDrv(sh *SharedGroup) (err error) { Cache.SetWithoutReplicate(utils.CacheSharedGroups, sh.Id, sh, nil, - cacheCommit(utils.NonTransactional), utils.NonTransactional) + true, utils.NonTransactional) return } func (iDB *InternalDB) RemoveSharedGroupDrv(id string) (err error) { Cache.RemoveWithoutReplicate(utils.CacheSharedGroups, id, - cacheCommit(utils.NonTransactional), utils.NonTransactional) + true, utils.NonTransactional) return } @@ -348,51 +348,31 @@ func (iDB *InternalDB) GetActionTriggersDrv(id string) (at ActionTriggers, err e func (iDB *InternalDB) SetActionTriggersDrv(id string, at ActionTriggers) (err error) { Cache.SetWithoutReplicate(utils.CacheActionTriggers, id, at, nil, - cacheCommit(utils.NonTransactional), utils.NonTransactional) + true, utils.NonTransactional) return } func (iDB *InternalDB) RemoveActionTriggersDrv(id string) (err error) { Cache.RemoveWithoutReplicate(utils.CacheActionTriggers, id, - cacheCommit(utils.NonTransactional), utils.NonTransactional) + true, utils.NonTransactional) return } -func (iDB *InternalDB) GetActionPlanDrv(key string, skipCache bool, - transactionID string) (ats *ActionPlan, err error) { +func (iDB *InternalDB) GetActionPlanDrv(key string) (ats *ActionPlan, err error) { if x, ok := Cache.Get(utils.CacheActionPlans, key); ok && x != nil { return x.(*ActionPlan), nil } return nil, utils.ErrNotFound } -func (iDB *InternalDB) SetActionPlanDrv(key string, ats *ActionPlan, - overwrite bool, transactionID string) (err error) { - cCommit := cacheCommit(transactionID) - if len(ats.ActionTimings) == 0 { - Cache.RemoveWithoutReplicate(utils.CacheActionPlans, key, - cCommit, transactionID) - return - } - if !overwrite { - // get existing action plan to merge the account ids - if existingAts, _ := iDB.GetActionPlanDrv(key, true, - transactionID); existingAts != nil { - if ats.AccountIDs == nil && len(existingAts.AccountIDs) > 0 { - ats.AccountIDs = make(utils.StringMap) - } - for accID := range existingAts.AccountIDs { - ats.AccountIDs[accID] = true - } - } - } +func (iDB *InternalDB) SetActionPlanDrv(key string, ats *ActionPlan) (err error) { Cache.SetWithoutReplicate(utils.CacheActionPlans, key, ats, nil, - cacheCommit(utils.NonTransactional), utils.NonTransactional) + true, utils.NonTransactional) return } -func (iDB *InternalDB) RemoveActionPlanDrv(key string, transactionID string) (err error) { - Cache.RemoveWithoutReplicate(utils.CacheActionPlans, key, cacheCommit(transactionID), transactionID) +func (iDB *InternalDB) RemoveActionPlanDrv(key string) (err error) { + Cache.RemoveWithoutReplicate(utils.CacheActionPlans, key, true, utils.NonTransactional) return } @@ -405,7 +385,7 @@ func (iDB *InternalDB) GetAllActionPlansDrv() (ats map[string]*ActionPlan, err e ats = make(map[string]*ActionPlan, len(keys)) for _, key := range keys { var ap *ActionPlan - if ap, err = iDB.GetActionPlanDrv(key[len(utils.ActionPlanPrefix):], false, utils.NonTransactional); err != nil { + if ap, err = iDB.GetActionPlanDrv(key[len(utils.ActionPlanPrefix):]); err != nil { ats = nil return } @@ -414,58 +394,22 @@ func (iDB *InternalDB) GetAllActionPlansDrv() (ats map[string]*ActionPlan, err e return } -func (iDB *InternalDB) GetAccountActionPlansDrv(acntID string, - skipCache bool, transactionID string) (apIDs []string, err error) { +func (iDB *InternalDB) GetAccountActionPlansDrv(acntID string) (apIDs []string, err error) { if x, ok := Cache.Get(utils.CacheAccountActionPlans, acntID); ok && x != nil { return x.([]string), nil } return nil, utils.ErrNotFound } -func (iDB *InternalDB) SetAccountActionPlansDrv(acntID string, apIDs []string, overwrite bool) (err error) { - if !overwrite { - var oldaPlIDs []string - if oldaPlIDs, err = iDB.GetAccountActionPlansDrv(acntID, - true, utils.NonTransactional); err != nil && err != utils.ErrNotFound { - return - } - err = nil - for _, oldAPid := range oldaPlIDs { - if !utils.IsSliceMember(apIDs, oldAPid) { - apIDs = append(apIDs, oldAPid) - } - } - } +func (iDB *InternalDB) SetAccountActionPlansDrv(acntID string, apIDs []string) (err error) { Cache.SetWithoutReplicate(utils.CacheAccountActionPlans, acntID, apIDs, nil, - cacheCommit(utils.NonTransactional), utils.NonTransactional) + true, utils.NonTransactional) return } -func (iDB *InternalDB) RemAccountActionPlansDrv(acntID string, apIDs []string) (err error) { - if len(apIDs) == 0 { - Cache.RemoveWithoutReplicate(utils.CacheAccountActionPlans, acntID, - cacheCommit(utils.NonTransactional), utils.NonTransactional) - return - } - var oldaPlIDs []string - if oldaPlIDs, err = iDB.GetAccountActionPlansDrv(acntID, - true, utils.NonTransactional); err != nil { - return - } - for i := 0; i < len(oldaPlIDs); { - if utils.IsSliceMember(apIDs, oldaPlIDs[i]) { - oldaPlIDs = append(oldaPlIDs[:i], oldaPlIDs[i+1:]...) - continue - } - i++ - } - if len(oldaPlIDs) == 0 { - Cache.RemoveWithoutReplicate(utils.CacheAccountActionPlans, acntID, - cacheCommit(utils.NonTransactional), utils.NonTransactional) - return - } - Cache.SetWithoutReplicate(utils.CacheAccountActionPlans, acntID, oldaPlIDs, nil, - cacheCommit(utils.NonTransactional), utils.NonTransactional) +func (iDB *InternalDB) RemAccountActionPlansDrv(acntID string) (err error) { + Cache.RemoveWithoutReplicate(utils.CacheAccountActionPlans, acntID, + true, utils.NonTransactional) return } @@ -511,13 +455,13 @@ func (iDB *InternalDB) SetAccountDrv(acc *Account) (err error) { } acc.UpdateTime = time.Now() Cache.SetWithoutReplicate(utils.CacheAccounts, acc.ID, acc, nil, - cacheCommit(utils.NonTransactional), utils.NonTransactional) + true, utils.NonTransactional) return } func (iDB *InternalDB) RemoveAccountDrv(id string) (err error) { Cache.RemoveWithoutReplicate(utils.CacheAccounts, id, - cacheCommit(utils.NonTransactional), utils.NonTransactional) + true, utils.NonTransactional) return } @@ -530,13 +474,13 @@ func (iDB *InternalDB) GetResourceProfileDrv(tenant, id string) (rp *ResourcePro func (iDB *InternalDB) SetResourceProfileDrv(rp *ResourceProfile) (err error) { Cache.SetWithoutReplicate(utils.CacheResourceProfiles, rp.TenantID(), rp, nil, - cacheCommit(utils.NonTransactional), utils.NonTransactional) + true, utils.NonTransactional) return } func (iDB *InternalDB) RemoveResourceProfileDrv(tenant, id string) (err error) { Cache.RemoveWithoutReplicate(utils.CacheResourceProfiles, utils.ConcatenatedKey(tenant, id), - cacheCommit(utils.NonTransactional), utils.NonTransactional) + true, utils.NonTransactional) return } @@ -549,13 +493,13 @@ func (iDB *InternalDB) GetResourceDrv(tenant, id string) (r *Resource, err error func (iDB *InternalDB) SetResourceDrv(r *Resource) (err error) { Cache.SetWithoutReplicate(utils.CacheResources, r.TenantID(), r, nil, - cacheCommit(utils.NonTransactional), utils.NonTransactional) + true, utils.NonTransactional) return } func (iDB *InternalDB) RemoveResourceDrv(tenant, id string) (err error) { Cache.RemoveWithoutReplicate(utils.CacheResources, utils.ConcatenatedKey(tenant, id), - cacheCommit(utils.NonTransactional), utils.NonTransactional) + true, utils.NonTransactional) return } @@ -569,13 +513,13 @@ func (iDB *InternalDB) GetTimingDrv(id string) (tmg *utils.TPTiming, err error) func (iDB *InternalDB) SetTimingDrv(timing *utils.TPTiming) (err error) { Cache.SetWithoutReplicate(utils.CacheTimings, timing.ID, timing, nil, - cacheCommit(utils.NonTransactional), utils.NonTransactional) + true, utils.NonTransactional) return } func (iDB *InternalDB) RemoveTimingDrv(id string) (err error) { Cache.RemoveWithoutReplicate(utils.CacheTimings, id, - cacheCommit(utils.NonTransactional), utils.NonTransactional) + true, utils.NonTransactional) return } @@ -597,13 +541,13 @@ func (iDB *InternalDB) GetStatQueueProfileDrv(tenant string, id string) (sq *Sta } func (iDB *InternalDB) SetStatQueueProfileDrv(sq *StatQueueProfile) (err error) { Cache.SetWithoutReplicate(utils.CacheStatQueueProfiles, sq.TenantID(), sq, nil, - cacheCommit(utils.NonTransactional), utils.NonTransactional) + true, utils.NonTransactional) return } func (iDB *InternalDB) RemStatQueueProfileDrv(tenant, id string) (err error) { Cache.RemoveWithoutReplicate(utils.CacheStatQueueProfiles, utils.ConcatenatedKey(tenant, id), - cacheCommit(utils.NonTransactional), utils.NonTransactional) + true, utils.NonTransactional) return } @@ -622,12 +566,12 @@ func (iDB *InternalDB) SetStatQueueDrv(ssq *StoredStatQueue, sq *StatQueue) (err } } Cache.SetWithoutReplicate(utils.CacheStatQueues, utils.ConcatenatedKey(sq.Tenant, sq.ID), sq, nil, - cacheCommit(utils.NonTransactional), utils.NonTransactional) + true, utils.NonTransactional) return } func (iDB *InternalDB) RemStatQueueDrv(tenant, id string) (err error) { Cache.RemoveWithoutReplicate(utils.CacheStatQueues, utils.ConcatenatedKey(tenant, id), - cacheCommit(utils.NonTransactional), utils.NonTransactional) + true, utils.NonTransactional) return } @@ -641,13 +585,13 @@ func (iDB *InternalDB) GetThresholdProfileDrv(tenant, id string) (tp *ThresholdP func (iDB *InternalDB) SetThresholdProfileDrv(tp *ThresholdProfile) (err error) { Cache.SetWithoutReplicate(utils.CacheThresholdProfiles, tp.TenantID(), tp, nil, - cacheCommit(utils.NonTransactional), utils.NonTransactional) + true, utils.NonTransactional) return } func (iDB *InternalDB) RemThresholdProfileDrv(tenant, id string) (err error) { Cache.RemoveWithoutReplicate(utils.CacheThresholdProfiles, utils.ConcatenatedKey(tenant, id), - cacheCommit(utils.NonTransactional), utils.NonTransactional) + true, utils.NonTransactional) return } @@ -661,13 +605,13 @@ func (iDB *InternalDB) GetThresholdDrv(tenant, id string) (th *Threshold, err er func (iDB *InternalDB) SetThresholdDrv(th *Threshold) (err error) { Cache.SetWithoutReplicate(utils.CacheThresholds, th.TenantID(), th, nil, - cacheCommit(utils.NonTransactional), utils.NonTransactional) + true, utils.NonTransactional) return } func (iDB *InternalDB) RemoveThresholdDrv(tenant, id string) (err error) { Cache.RemoveWithoutReplicate(utils.CacheThresholds, utils.ConcatenatedKey(tenant, id), - cacheCommit(utils.NonTransactional), utils.NonTransactional) + true, utils.NonTransactional) return } @@ -685,13 +629,13 @@ func (iDB *InternalDB) SetFilterDrv(fltr *Filter) (err error) { return } Cache.SetWithoutReplicate(utils.CacheFilters, fltr.TenantID(), fltr, nil, - cacheCommit(utils.NonTransactional), utils.NonTransactional) + true, utils.NonTransactional) return } func (iDB *InternalDB) RemoveFilterDrv(tenant, id string) (err error) { Cache.RemoveWithoutReplicate(utils.CacheFilters, utils.ConcatenatedKey(tenant, id), - cacheCommit(utils.NonTransactional), utils.NonTransactional) + true, utils.NonTransactional) return } @@ -708,13 +652,13 @@ func (iDB *InternalDB) SetRouteProfileDrv(spp *RouteProfile) (err error) { return } Cache.SetWithoutReplicate(utils.CacheRouteProfiles, spp.TenantID(), spp, nil, - cacheCommit(utils.NonTransactional), utils.NonTransactional) + true, utils.NonTransactional) return } func (iDB *InternalDB) RemoveRouteProfileDrv(tenant, id string) (err error) { Cache.RemoveWithoutReplicate(utils.CacheRouteProfiles, utils.ConcatenatedKey(tenant, id), - cacheCommit(utils.NonTransactional), utils.NonTransactional) + true, utils.NonTransactional) return } @@ -731,13 +675,13 @@ func (iDB *InternalDB) SetAttributeProfileDrv(attr *AttributeProfile) (err error return } Cache.SetWithoutReplicate(utils.CacheAttributeProfiles, attr.TenantID(), attr, nil, - cacheCommit(utils.NonTransactional), utils.NonTransactional) + true, utils.NonTransactional) return } func (iDB *InternalDB) RemoveAttributeProfileDrv(tenant, id string) (err error) { Cache.RemoveWithoutReplicate(utils.CacheAttributeProfiles, utils.ConcatenatedKey(tenant, id), - cacheCommit(utils.NonTransactional), utils.NonTransactional) + true, utils.NonTransactional) return } @@ -751,13 +695,13 @@ func (iDB *InternalDB) GetChargerProfileDrv(tenant, id string) (ch *ChargerProfi func (iDB *InternalDB) SetChargerProfileDrv(chr *ChargerProfile) (err error) { Cache.SetWithoutReplicate(utils.CacheChargerProfiles, chr.TenantID(), chr, nil, - cacheCommit(utils.NonTransactional), utils.NonTransactional) + true, utils.NonTransactional) return } func (iDB *InternalDB) RemoveChargerProfileDrv(tenant, id string) (err error) { Cache.RemoveWithoutReplicate(utils.CacheChargerProfiles, utils.ConcatenatedKey(tenant, id), - cacheCommit(utils.NonTransactional), utils.NonTransactional) + true, utils.NonTransactional) return } @@ -771,13 +715,13 @@ func (iDB *InternalDB) GetDispatcherProfileDrv(tenant, id string) (dpp *Dispatch func (iDB *InternalDB) SetDispatcherProfileDrv(dpp *DispatcherProfile) (err error) { Cache.SetWithoutReplicate(utils.CacheDispatcherProfiles, dpp.TenantID(), dpp, nil, - cacheCommit(utils.NonTransactional), utils.NonTransactional) + true, utils.NonTransactional) return } func (iDB *InternalDB) RemoveDispatcherProfileDrv(tenant, id string) (err error) { Cache.RemoveWithoutReplicate(utils.CacheDispatcherProfiles, utils.ConcatenatedKey(tenant, id), - cacheCommit(utils.NonTransactional), utils.NonTransactional) + true, utils.NonTransactional) return } @@ -795,7 +739,7 @@ func (iDB *InternalDB) GetItemLoadIDsDrv(itemIDPrefix string) (loadIDs map[strin func (iDB *InternalDB) SetLoadIDsDrv(loadIDs map[string]int64) (err error) { Cache.SetWithoutReplicate(utils.CacheLoadIDs, utils.LoadIDs, loadIDs, nil, - cacheCommit(utils.NonTransactional), utils.NonTransactional) + true, utils.NonTransactional) return } @@ -809,13 +753,13 @@ func (iDB *InternalDB) GetDispatcherHostDrv(tenant, id string) (dpp *DispatcherH func (iDB *InternalDB) SetDispatcherHostDrv(dpp *DispatcherHost) (err error) { Cache.SetWithoutReplicate(utils.CacheDispatcherHosts, dpp.TenantID(), dpp, nil, - cacheCommit(utils.NonTransactional), utils.NonTransactional) + true, utils.NonTransactional) return } func (iDB *InternalDB) RemoveDispatcherHostDrv(tenant, id string) (err error) { Cache.RemoveWithoutReplicate(utils.CacheDispatcherHosts, utils.ConcatenatedKey(tenant, id), - cacheCommit(utils.NonTransactional), utils.NonTransactional) + true, utils.NonTransactional) return } @@ -861,10 +805,10 @@ func (iDB *InternalDB) SetIndexesDrv(idxItmType, tntCtx string, continue } Cache.RemoveWithoutReplicate(idxItmType, dbKey, - cacheCommit(utils.NonTransactional), utils.NonTransactional) + true, utils.NonTransactional) key := strings.TrimSuffix(strings.TrimPrefix(dbKey, "tmp_"), utils.ConcatenatedKeySep+transactionID) Cache.SetWithoutReplicate(idxItmType, key, x, []string{tntCtx}, - cacheCommit(utils.NonTransactional), utils.NonTransactional) + true, utils.NonTransactional) } return } @@ -875,7 +819,7 @@ func (iDB *InternalDB) SetIndexesDrv(idxItmType, tntCtx string, } if len(indx) == 0 { Cache.SetWithoutReplicate(idxItmType, dbKey, nil, []string{tntCtx}, - cacheCommit(utils.NonTransactional), utils.NonTransactional) + true, utils.NonTransactional) continue } //to be the same as HMSET @@ -883,7 +827,7 @@ func (iDB *InternalDB) SetIndexesDrv(idxItmType, tntCtx string, indx = utils.JoinStringSet(indx, x.(utils.StringSet)) } Cache.SetWithoutReplicate(idxItmType, dbKey, indx, []string{tntCtx}, - cacheCommit(utils.NonTransactional), utils.NonTransactional) + true, utils.NonTransactional) } return } @@ -893,6 +837,6 @@ func (iDB *InternalDB) RemoveIndexesDrv(idxItmType, tntCtx, idxKey string) (err Cache.tCache.RemoveGroup(idxItmType, tntCtx, true, utils.EmptyString) return } - Cache.RemoveWithoutReplicate(idxItmType, utils.ConcatenatedKey(tntCtx, idxKey), cacheCommit(utils.NonTransactional), utils.NonTransactional) + Cache.RemoveWithoutReplicate(idxItmType, utils.ConcatenatedKey(tntCtx, idxKey), true, utils.NonTransactional) return } diff --git a/engine/storage_mongo_datadb.go b/engine/storage_mongo_datadb.go index ab26b7503..86ea74e94 100644 --- a/engine/storage_mongo_datadb.go +++ b/engine/storage_mongo_datadb.go @@ -34,7 +34,6 @@ import ( "github.com/cgrates/cgrates/config" "github.com/cgrates/cgrates/guardian" "github.com/cgrates/cgrates/utils" - "github.com/cgrates/ltcache" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/bson/bsoncodec" @@ -1205,19 +1204,7 @@ func (ms *MongoStorage) RemoveActionTriggersDrv(key string) error { }) } -func (ms *MongoStorage) GetActionPlanDrv(key string, skipCache bool, - transactionID string) (ats *ActionPlan, err error) { - if !skipCache { - if x, err := Cache.GetCloned(utils.CacheActionPlans, key); err != nil { - if err != ltcache.ErrNotFound { // Only consider cache if item was found - return nil, err - } - } else if x == nil { // item was placed nil in cache - return nil, utils.ErrNotFound - } else { - return x.(*ActionPlan), nil - } - } +func (ms *MongoStorage) GetActionPlanDrv(key string) (ats *ActionPlan, err error) { var kv struct { Key string Value []byte @@ -1226,10 +1213,6 @@ func (ms *MongoStorage) GetActionPlanDrv(key string, skipCache bool, cur := ms.getCol(ColApl).FindOne(sctx, bson.M{"key": key}) if err := cur.Decode(&kv); err != nil { if err == mongo.ErrNoDocuments { - if errCh := Cache.Set(utils.CacheActionPlans, key, nil, nil, - cacheCommit(transactionID), transactionID); errCh != nil { - return errCh - } return utils.ErrNotFound } return err @@ -1248,42 +1231,11 @@ func (ms *MongoStorage) GetActionPlanDrv(key string, skipCache bool, return nil, err } r.Close() - if err = ms.ms.Unmarshal(out, &ats); err != nil { - return nil, err - } - if errCh := Cache.Set(utils.CacheActionPlans, key, ats, nil, - cacheCommit(transactionID), transactionID); errCh != nil { - return nil, errCh - } + err = ms.ms.Unmarshal(out, &ats) return } -func (ms *MongoStorage) SetActionPlanDrv(key string, ats *ActionPlan, - overwrite bool, transactionID string) (err error) { - // clean dots from account ids map - cCommit := cacheCommit(transactionID) - if len(ats.ActionTimings) == 0 { - err = ms.query(func(sctx mongo.SessionContext) (err error) { - _, err = ms.getCol(ColApl).DeleteOne(sctx, bson.M{"key": key}) - return err - }) - if errCh := Cache.Remove(utils.CacheActionPlans, key, - cCommit, transactionID); errCh != nil { - return errCh - } - return - } - if !overwrite { - // get existing action plan to merge the account ids - if existingAts, _ := ms.GetActionPlanDrv(key, true, transactionID); existingAts != nil { - if ats.AccountIDs == nil && len(existingAts.AccountIDs) > 0 { - ats.AccountIDs = make(utils.StringMap) - } - for accID := range existingAts.AccountIDs { - ats.AccountIDs[accID] = true - } - } - } +func (ms *MongoStorage) SetActionPlanDrv(key string, ats *ActionPlan) (err error) { result, err := ms.ms.Marshal(ats) if err != nil { return err @@ -1304,11 +1256,7 @@ func (ms *MongoStorage) SetActionPlanDrv(key string, ats *ActionPlan, }) } -func (ms *MongoStorage) RemoveActionPlanDrv(key string, transactionID string) error { - cCommit := cacheCommit(transactionID) - if errCh := Cache.Remove(utils.CacheActionPlans, key, cCommit, transactionID); errCh != nil { - return errCh - } +func (ms *MongoStorage) RemoveActionPlanDrv(key string) error { return ms.query(func(sctx mongo.SessionContext) (err error) { _, err = ms.getCol(ColApl).DeleteOne(sctx, bson.M{"key": key}) return err @@ -1325,8 +1273,7 @@ func (ms *MongoStorage) GetAllActionPlansDrv() (ats map[string]*ActionPlan, err } ats = make(map[string]*ActionPlan, len(keys)) for _, key := range keys { - ap, err := ms.GetActionPlanDrv(key[len(utils.ActionPlanPrefix):], - false, utils.NonTransactional) + ap, err := ms.GetActionPlanDrv(key[len(utils.ActionPlanPrefix):]) if err != nil { return nil, err } @@ -1335,15 +1282,7 @@ func (ms *MongoStorage) GetAllActionPlansDrv() (ats map[string]*ActionPlan, err return } -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 { - return nil, utils.ErrNotFound - } - return x.([]string), nil - } - } +func (ms *MongoStorage) GetAccountActionPlansDrv(acntID string) (aPlIDs []string, err error) { var kv struct { Key string Value []string @@ -1352,10 +1291,6 @@ func (ms *MongoStorage) GetAccountActionPlansDrv(acntID string, skipCache bool, cur := ms.getCol(ColAAp).FindOne(sctx, bson.M{"key": acntID}) if err := cur.Decode(&kv); err != nil { if err == mongo.ErrNoDocuments { - if errCh := Cache.Set(utils.CacheAccountActionPlans, acntID, nil, nil, - cacheCommit(transactionID), transactionID); errCh != nil { - return errCh - } return utils.ErrNotFound } return err @@ -1365,25 +1300,10 @@ func (ms *MongoStorage) GetAccountActionPlansDrv(acntID string, skipCache bool, return nil, err } aPlIDs = kv.Value - if errCh := Cache.Set(utils.CacheAccountActionPlans, acntID, aPlIDs, nil, - cacheCommit(transactionID), transactionID); errCh != nil { - return nil, errCh - } return } -func (ms *MongoStorage) SetAccountActionPlansDrv(acntID string, aPlIDs []string, overwrite bool) (err error) { - if !overwrite { - if oldaPlIDs, err := ms.GetAccountActionPlansDrv(acntID, true, utils.NonTransactional); err != nil && err != utils.ErrNotFound { - return err - } else { - for _, oldAPid := range oldaPlIDs { - if !utils.IsSliceMember(aPlIDs, oldAPid) { - aPlIDs = append(aPlIDs, oldAPid) - } - } - } - } +func (ms *MongoStorage) SetAccountActionPlansDrv(acntID string, aPlIDs []string) (err error) { return ms.query(func(sctx mongo.SessionContext) (err error) { _, err = ms.getCol(ColAAp).UpdateOne(sctx, bson.M{"key": acntID}, bson.M{"$set": struct { @@ -1397,44 +1317,12 @@ func (ms *MongoStorage) SetAccountActionPlansDrv(acntID string, aPlIDs []string, } // ToDo: check return len(aPlIDs) == 0 -func (ms *MongoStorage) RemAccountActionPlansDrv(acntID string, aPlIDs []string) (err error) { - if len(aPlIDs) == 0 { - return ms.query(func(sctx mongo.SessionContext) (err error) { - dr, err := ms.getCol(ColAAp).DeleteOne(sctx, bson.M{"key": acntID}) - if dr.DeletedCount == 0 { - return utils.ErrNotFound - } - return err - }) - } - oldAPlIDs, err := ms.GetAccountActionPlansDrv(acntID, true, utils.NonTransactional) - if err != nil { - return err - } - for i := 0; i < len(oldAPlIDs); { - if utils.IsSliceMember(aPlIDs, oldAPlIDs[i]) { - oldAPlIDs = append(oldAPlIDs[:i], oldAPlIDs[i+1:]...) - continue // if we have stripped, don't increase index so we can check next element by next run - } - i++ - } - if len(oldAPlIDs) == 0 { // no more elements, remove the reference - return ms.query(func(sctx mongo.SessionContext) (err error) { - dr, err := ms.getCol(ColAAp).DeleteOne(sctx, bson.M{"key": acntID}) - if dr.DeletedCount == 0 { - return utils.ErrNotFound - } - return err - }) - } +func (ms *MongoStorage) RemAccountActionPlansDrv(acntID string) (err error) { return ms.query(func(sctx mongo.SessionContext) (err error) { - _, err = ms.getCol(ColAAp).UpdateOne(sctx, bson.M{"key": acntID}, - bson.M{"$set": struct { - Key string - Value []string - }{Key: acntID, Value: oldAPlIDs}}, - options.Update().SetUpsert(true), - ) + dr, err := ms.getCol(ColAAp).DeleteOne(sctx, bson.M{"key": acntID}) + if dr.DeletedCount == 0 { + return utils.ErrNotFound + } return err }) } diff --git a/engine/storage_redis.go b/engine/storage_redis.go index 67cc42cde..50536b78b 100644 --- a/engine/storage_redis.go +++ b/engine/storage_redis.go @@ -32,7 +32,6 @@ import ( "github.com/cgrates/cgrates/config" "github.com/cgrates/cgrates/guardian" "github.com/cgrates/cgrates/utils" - "github.com/cgrates/ltcache" "github.com/mediocregopher/radix/v3" ) @@ -624,27 +623,11 @@ func (rs *RedisStorage) RemoveActionTriggersDrv(key string) (err error) { return rs.Cmd(nil, redis_DEL, utils.ActionTriggerPrefix+key) } -func (rs *RedisStorage) GetActionPlanDrv(key string, skipCache bool, - transactionID string) (ats *ActionPlan, err error) { - if !skipCache { - if x, err := Cache.GetCloned(utils.CacheActionPlans, key); err != nil { - if err != ltcache.ErrNotFound { // Only consider cache if item was found - return nil, err - } - } else if x == nil { // item was placed nil in cache - return nil, utils.ErrNotFound - } else { - return x.(*ActionPlan), nil - } - } +func (rs *RedisStorage) GetActionPlanDrv(key string) (ats *ActionPlan, err error) { var values []byte if err = rs.Cmd(&values, redis_GET, utils.ActionPlanPrefix+key); err != nil { return } else if len(values) == 0 { - if errCh := Cache.Set(utils.CacheActionPlans, key, nil, nil, - cacheCommit(transactionID), transactionID); errCh != nil { - return nil, errCh - } err = utils.ErrNotFound return } @@ -658,53 +641,17 @@ func (rs *RedisStorage) GetActionPlanDrv(key string, skipCache bool, return } r.Close() - if err = rs.ms.Unmarshal(out, &ats); err != nil { - return - } - err = Cache.Set(utils.CacheActionPlans, key, ats, nil, - cacheCommit(transactionID), transactionID) + err = rs.ms.Unmarshal(out, &ats) return } -func (rs *RedisStorage) RemoveActionPlanDrv(key string, - transactionID string) (err error) { - cCommit := cacheCommit(transactionID) +func (rs *RedisStorage) RemoveActionPlanDrv(key string) (err error) { if err = rs.Cmd(nil, redis_SREM, utils.ActionPlanIndexes, utils.ActionPlanPrefix+key); err != nil { return } - err = rs.Cmd(nil, redis_DEL, utils.ActionPlanPrefix+key) - if errCh := Cache.Remove(utils.CacheActionPlans, key, - cCommit, transactionID); errCh != nil { - return errCh - } - return + return rs.Cmd(nil, redis_DEL, utils.ActionPlanPrefix+key) } -func (rs *RedisStorage) SetActionPlanDrv(key string, ats *ActionPlan, - overwrite bool, transactionID string) (err error) { - cCommit := cacheCommit(transactionID) - if len(ats.ActionTimings) == 0 { - // delete the key - if err = rs.Cmd(nil, redis_SREM, utils.ActionPlanIndexes, utils.ActionPlanPrefix+key); err != nil { - return - } - err = rs.Cmd(nil, redis_DEL, utils.ActionPlanPrefix+key) - if errCh := Cache.Remove(utils.CacheActionPlans, key, - cCommit, transactionID); errCh != nil { - return errCh - } - return - } - if !overwrite { - // get existing action plan to merge the account ids - if existingAts, _ := rs.GetActionPlanDrv(key, true, transactionID); existingAts != nil { - if ats.AccountIDs == nil && len(existingAts.AccountIDs) > 0 { - ats.AccountIDs = make(utils.StringMap) - } - for accID := range existingAts.AccountIDs { - ats.AccountIDs[accID] = true - } - } - } +func (rs *RedisStorage) SetActionPlanDrv(key string, ats *ActionPlan) (err error) { var result []byte if result, err = rs.ms.Marshal(ats); err != nil { return @@ -730,56 +677,27 @@ func (rs *RedisStorage) GetAllActionPlansDrv() (ats map[string]*ActionPlan, err } ats = make(map[string]*ActionPlan, len(keys)) for _, key := range keys { - if ats[key[len(utils.ActionPlanPrefix):]], err = rs.GetActionPlanDrv(key[len(utils.ActionPlanPrefix):], - false, utils.NonTransactional); err != nil { + if ats[key[len(utils.ActionPlanPrefix):]], err = rs.GetActionPlanDrv(key[len(utils.ActionPlanPrefix):]); err != nil { return nil, err } } return } -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 { - if x == nil { - return nil, utils.ErrNotFound - } - return x.([]string), nil - } - } +func (rs *RedisStorage) GetAccountActionPlansDrv(acntID string) (aPlIDs []string, err error) { var values []byte if err = rs.Cmd(&values, redis_GET, utils.AccountActionPlansPrefix+acntID); err != nil { return } else if len(values) == 0 { - if errCh := Cache.Set(utils.CacheAccountActionPlans, acntID, nil, nil, - cacheCommit(transactionID), transactionID); errCh != nil { - return nil, errCh - } err = utils.ErrNotFound return } - if err = rs.ms.Unmarshal(values, &aPlIDs); err != nil { - return - } - err = Cache.Set(utils.CacheAccountActionPlans, acntID, aPlIDs, nil, - cacheCommit(transactionID), transactionID) + err = rs.ms.Unmarshal(values, &aPlIDs) return } -func (rs *RedisStorage) SetAccountActionPlansDrv(acntID string, aPlIDs []string, overwrite bool) (err error) { - if !overwrite { - var oldaPlIDs []string - if oldaPlIDs, err = rs.GetAccountActionPlansDrv(acntID, true, utils.NonTransactional); err != nil && err != utils.ErrNotFound { - return - } - for _, oldAPid := range oldaPlIDs { - if !utils.IsSliceMember(aPlIDs, oldAPid) { - aPlIDs = append(aPlIDs, oldAPid) - } - } - } +func (rs *RedisStorage) SetAccountActionPlansDrv(acntID string, aPlIDs []string) (err error) { var result []byte if result, err = rs.ms.Marshal(aPlIDs); err != nil { return @@ -787,30 +705,8 @@ func (rs *RedisStorage) SetAccountActionPlansDrv(acntID string, aPlIDs []string, return rs.Cmd(nil, redis_SET, utils.AccountActionPlansPrefix+acntID, string(result)) } -func (rs *RedisStorage) RemAccountActionPlansDrv(acntID string, aPlIDs []string) (err error) { - key := utils.AccountActionPlansPrefix + acntID - if len(aPlIDs) == 0 { - return rs.Cmd(nil, redis_DEL, key) - } - var oldaPlIDs []string - if oldaPlIDs, err = rs.GetAccountActionPlansDrv(acntID, true, utils.NonTransactional); err != nil { - return - } - for i := 0; i < len(oldaPlIDs); { - if utils.IsSliceMember(aPlIDs, oldaPlIDs[i]) { - oldaPlIDs = append(oldaPlIDs[:i], oldaPlIDs[i+1:]...) - continue // if we have stripped, don't increase index so we can check next element by next run - } - i++ - } - if len(oldaPlIDs) == 0 { // no more elements, remove the reference - return rs.Cmd(nil, redis_DEL, key) - } - var result []byte - if result, err = rs.ms.Marshal(oldaPlIDs); err != nil { - return - } - return rs.Cmd(nil, redis_SET, key, string(result)) +func (rs *RedisStorage) RemAccountActionPlansDrv(acntID string) (err error) { + return rs.Cmd(nil, redis_DEL, utils.AccountActionPlansPrefix+acntID) } func (rs *RedisStorage) PushTask(t *Task) (err error) { diff --git a/engine/tpreader.go b/engine/tpreader.go index 58b55dfbb..db74feadb 100644 --- a/engine/tpreader.go +++ b/engine/tpreader.go @@ -698,7 +698,7 @@ func (tpr *TpReader) LoadAccountActionsFiltered(qriedAA *utils.TPAccountActions) if accountAction.ActionPlanId != "" { // get old userBalanceIds exitingAccountIds := make(utils.StringMap) - existingActionPlan, err := tpr.dm.GetActionPlan(accountAction.ActionPlanId, true, utils.NonTransactional) + existingActionPlan, err := tpr.dm.GetActionPlan(accountAction.ActionPlanId, false, false, utils.NonTransactional) if err == nil && existingActionPlan != nil { exitingAccountIds = existingActionPlan.AccountIDs } @@ -1069,7 +1069,7 @@ func (tpr *TpReader) LoadAccountActions() (err error) { actionPlan, exists := tpr.actionPlans[aa.ActionPlanId] if !exists { if tpr.dm.dataDB != nil { - if actionPlan, err = tpr.dm.GetActionPlan(aa.ActionPlanId, true, utils.NonTransactional); err != nil { + if actionPlan, err = tpr.dm.GetActionPlan(aa.ActionPlanId, false, false, utils.NonTransactional); err != nil { if err.Error() == utils.ErrNotFound.Error() { return fmt.Errorf("could not get action plan for tag %v", aa.ActionPlanId) } diff --git a/engine/z_loader_it_test.go b/engine/z_loader_it_test.go index db19302f5..163183d5d 100644 --- a/engine/z_loader_it_test.go +++ b/engine/z_loader_it_test.go @@ -301,7 +301,7 @@ func testLoaderITWriteToDatabase(t *testing.T) { } for k, ap := range loader.actionPlans { - rcv, err := loader.dm.GetActionPlan(k, true, utils.NonTransactional) + rcv, err := loader.dm.GetActionPlan(k, false, false, utils.NonTransactional) if err != nil { t.Error("Failed GetActionPlan: ", err.Error()) } diff --git a/engine/z_onstor_it_test.go b/engine/z_onstor_it_test.go index f520c8d9b..b6cc47f9b 100644 --- a/engine/z_onstor_it_test.go +++ b/engine/z_onstor_it_test.go @@ -57,6 +57,7 @@ var ( testOnStorITSharedGroup, testOnStorITCRUDActionPlan, testOnStorITCRUDAccountActionPlans, + testOnStorITCRUDAccountActionPlans2, testOnStorITCRUDAccount, testOnStorITResource, testOnStorITResourceProfile, @@ -1051,13 +1052,13 @@ func testOnStorITCRUDActionPlan(t *testing.T) { }, }, } - if _, rcvErr := onStor.GetActionPlan(ap.Id, true, utils.NonTransactional); rcvErr != utils.ErrNotFound { + if _, rcvErr := onStor.GetActionPlan(ap.Id, false, false, utils.NonTransactional); rcvErr != utils.ErrNotFound { t.Error(rcvErr) } if err := onStor.SetActionPlan(ap.Id, ap, true, utils.NonTransactional); err != nil { t.Error(err) } - if rcv, err := onStor.GetActionPlan(ap.Id, true, utils.NonTransactional); err != nil { + if rcv, err := onStor.GetActionPlan(ap.Id, false, false, utils.NonTransactional); err != nil { t.Error(err) } else if !reflect.DeepEqual(ap, rcv) { t.Errorf("Expecting: %v, received: %v", ap, rcv) @@ -1090,13 +1091,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.GetAccountActionPlans(acntID, true, utils.NonTransactional); rcvErr != utils.ErrNotFound { + if _, rcvErr := onStor.GetAccountActionPlans(acntID, false, false, utils.NonTransactional); rcvErr != utils.ErrNotFound { t.Error(rcvErr) } if err := onStor.SetAccountActionPlans(acntID, aAPs, true); err != nil { t.Error(err) } - if rcv, err := onStor.GetAccountActionPlans(acntID, true, utils.NonTransactional); err != nil { + if rcv, err := onStor.GetAccountActionPlans(acntID, false, false, utils.NonTransactional); err != nil { t.Error(err) } else if !reflect.DeepEqual(aAPs, rcv) { t.Errorf("Expecting: %v, received: %v", aAPs, rcv) @@ -1104,7 +1105,7 @@ func testOnStorITCRUDAccountActionPlans(t *testing.T) { if err := onStor.SetAccountActionPlans(acntID, aAPs2, false); err != nil { t.Error(err) } - if rcv, err := onStor.GetAccountActionPlans(acntID, true, utils.NonTransactional); err != nil { + if rcv, err := onStor.GetAccountActionPlans(acntID, false, true, utils.NonTransactional); err != nil { t.Error(err) } else if !reflect.DeepEqual(expect, rcv) { t.Errorf("Expecting: %v, received: %v", expect, rcv) @@ -1117,7 +1118,7 @@ func testOnStorITCRUDAccountActionPlans(t *testing.T) { // t.Error(rcvErr) // } // - if rcv, err := onStor.GetAccountActionPlans(acntID, false, utils.NonTransactional); err != nil { + if rcv, err := onStor.GetAccountActionPlans(acntID, true, true, utils.NonTransactional); err != nil { t.Error(err) } else if !reflect.DeepEqual(expect, rcv) { t.Errorf("Expecting: %v, received: %v", expect, rcv) @@ -1125,10 +1126,11 @@ func testOnStorITCRUDAccountActionPlans(t *testing.T) { // if err = onStor.DataDB().SelectDatabase(onStorCfg); err != nil { // t.Error(err) // } + if err := onStor.RemAccountActionPlans(acntID, aAPs2); err != nil { t.Error(err) } - if rcv, err := onStor.GetAccountActionPlans(acntID, true, utils.NonTransactional); err != nil { + if rcv, err := onStor.GetAccountActionPlans(acntID, false, true, utils.NonTransactional); err != nil { t.Error(err) } else if !reflect.DeepEqual(aAPs, rcv) { t.Errorf("Expecting: %v, received: %v", aAPs, rcv) @@ -1136,7 +1138,51 @@ func testOnStorITCRUDAccountActionPlans(t *testing.T) { if err := onStor.RemAccountActionPlans(acntID, aAPs); err != nil { t.Error(err) } - if _, rcvErr := onStor.GetAccountActionPlans(acntID, true, utils.NonTransactional); rcvErr != utils.ErrNotFound { + if v, rcvErr := onStor.GetAccountActionPlans(acntID, false, true, utils.NonTransactional); rcvErr != utils.ErrNotFound { + t.Error(rcvErr, v) + } +} + +func testOnStorITCRUDAccountActionPlans2(t *testing.T) { + acntID := utils.ConcatenatedKey("cgrates.org2", "1001") + acntID2 := utils.ConcatenatedKey("cgrates.org2", "1002") + expect := []string{"PACKAGE_10_SHARED_A_15", "PACKAGE_10_SHARED_A_5"} + // aAPs := []string{"PACKAGE_10_SHARED_A_5"} + if err := onStor.SetActionPlan("PACKAGE_10_SHARED_A_5", &ActionPlan{ + Id: "PACKAGE_10_SHARED_A_5", + AccountIDs: utils.NewStringMap(acntID, acntID2), + ActionTimings: []*ActionTiming{{}}, + }, true, utils.NonTransactional); err != nil { + t.Error(err) + } + if err := onStor.SetActionPlan("PACKAGE_10_SHARED_A_15", &ActionPlan{ + Id: "PACKAGE_10_SHARED_A_15", + AccountIDs: utils.NewStringMap(acntID, acntID2), + ActionTimings: []*ActionTiming{{}}, + }, true, utils.NonTransactional); err != nil { + t.Error(err) + } + Cache.SetWithoutReplicate(utils.CacheAccountActionPlans, acntID2, nil, nil, true, utils.NonTransactional) + if err = onStor.RebuildReverseForPrefix(utils.AccountActionPlansPrefix); err != nil { + t.Fatal(err) + } + if rcv, err := onStor.GetAccountActionPlans(acntID, false, false, utils.NonTransactional); err != nil { + t.Error(err) + } else if !reflect.DeepEqual(expect, rcv) { + t.Errorf("Expecting: %v, received: %v", expect, rcv) + } + if rcv, err := onStor.GetAccountActionPlans(acntID2, false, false, utils.NonTransactional); err != nil { + t.Error(err) + } else if !reflect.DeepEqual(expect, rcv) { + t.Errorf("Expecting: %v, received: %v", expect, rcv) + } + if err := onStor.RemAccountActionPlans(acntID, nil); err != nil { + t.Error(err) + } + if err := onStor.RemAccountActionPlans(acntID2, nil); err != nil { + t.Error(err) + } + if _, rcvErr := onStor.GetAccountActionPlans(acntID, false, false, utils.NonTransactional); rcvErr != utils.ErrNotFound { t.Error(rcvErr) } } diff --git a/migrator/action_plan.go b/migrator/action_plan.go index da652309c..be986e912 100644 --- a/migrator/action_plan.go +++ b/migrator/action_plan.go @@ -53,7 +53,7 @@ func (m *Migrator) migrateCurrentActionPlans() (err error) { for _, id := range ids { idg := strings.TrimPrefix(id, utils.ActionPlanPrefix) var acts *engine.ActionPlan - if acts, err = m.dmIN.DataManager().GetActionPlan(idg, true, utils.NonTransactional); err != nil { + if acts, err = m.dmIN.DataManager().GetActionPlan(idg, false, false, utils.NonTransactional); err != nil { return } if acts == nil || m.dryRun { diff --git a/migrator/action_plan_it_test.go b/migrator/action_plan_it_test.go index ebed0c2bb..bf25f4771 100644 --- a/migrator/action_plan_it_test.go +++ b/migrator/action_plan_it_test.go @@ -251,7 +251,7 @@ func testActPlnITMigrateAndMove(t *testing.T) { if err != nil { t.Error("Error when migrating ActionPlan ", err.Error()) } - result, err := actPlnMigrator.dmOut.DataManager().GetActionPlan((*v1actPln)[0].Id, true, utils.NonTransactional) + result, err := actPlnMigrator.dmOut.DataManager().GetActionPlan((*v1actPln)[0].Id, false, false, utils.NonTransactional) if err != nil { t.Fatal("Error when getting ActionPlan ", err.Error()) } @@ -278,7 +278,7 @@ func testActPlnITMigrateAndMove(t *testing.T) { if err != nil { t.Error("Error when migrating ActionPlan ", err.Error()) } - result, err := actPlnMigrator.dmOut.DataManager().GetActionPlan((*v1actPln)[0].Id, true, utils.NonTransactional) + result, err := actPlnMigrator.dmOut.DataManager().GetActionPlan((*v1actPln)[0].Id, false, false, utils.NonTransactional) if err != nil { t.Error("Error when getting ActionPlan ", err.Error()) } @@ -290,7 +290,7 @@ func testActPlnITMigrateAndMove(t *testing.T) { } else if !reflect.DeepEqual(actPln.ActionTimings[0].Timing, result.ActionTimings[0].Timing) { t.Errorf("Expecting: %+v, received: %+v", actPln.ActionTimings[0].Timing, result.ActionTimings[0].Timing) } - result, err = actPlnMigrator.dmIN.DataManager().GetActionPlan((*v1actPln)[0].Id, true, utils.NonTransactional) + result, err = actPlnMigrator.dmIN.DataManager().GetActionPlan((*v1actPln)[0].Id, false, false, utils.NonTransactional) if err != utils.ErrNotFound { t.Error(err) } else if actPlnMigrator.stats[utils.ActionPlans] != 1 {