Moved GetAccountActionPlansIndexHealth in engine

This commit is contained in:
Trial97
2021-06-16 18:23:06 +03:00
committed by Dan Christian Bogos
parent 5e7860eede
commit 1fc27c2d5b
5 changed files with 478 additions and 294 deletions

View File

@@ -19,13 +19,11 @@ along with this program. If not, see <http://www.gnu.org/licenses/>
package v1
import (
"fmt"
"strings"
"time"
"github.com/cgrates/cgrates/engine"
"github.com/cgrates/cgrates/utils"
"github.com/cgrates/ltcache"
)
type AttrGetFilterIndexes struct {
@@ -594,8 +592,8 @@ func (apierSv1 *APIerSv1) ComputeFilterIndexIDs(args *utils.ArgsComputeFilterInd
return nil
}
func (apierSv1 *APIerSv1) GetAccountActionPlansIndexHealth(args *IndexHealthArgs, reply *IndexHealthReply) error {
rp, err := getAccountActionPlanIndexHealth(apierSv1.DataManager, args.ObjectCacheLimit, args.IndexCacheLimit,
func (apierSv1 *APIerSv1) GetAccountActionPlansIndexHealth(args *engine.IndexHealthArgs, reply *engine.IndexHealthReply) error {
rp, err := engine.GetAccountActionPlanIndexHealth(apierSv1.DataManager, args.ObjectCacheLimit, args.IndexCacheLimit,
args.ObjectCacheTTL, args.IndexCacheTTL,
args.ObjectCacheStaticTTL, args.IndexCacheStaticTTL)
if err != nil {
@@ -604,126 +602,3 @@ func (apierSv1 *APIerSv1) GetAccountActionPlansIndexHealth(args *IndexHealthArgs
*reply = *rp
return nil
}
type IndexHealthArgs struct {
IndexCacheLimit int
IndexCacheTTL time.Duration
IndexCacheStaticTTL bool
ObjectCacheLimit int
ObjectCacheTTL time.Duration
ObjectCacheStaticTTL bool
}
type IndexHealthReply struct {
MissingObjects []string // list of object that are referenced in indexes but are not found in the dataDB
MissingIndexes map[string][]string // list of missing indexes for each object (the map has the key as the objectID and a list of indexes)
BrokenReferences map[string][]string // list of broken references (the map has the key as the objectID and a list of indexes)
}
// add cache in args API
func getAccountActionPlanIndexHealth(dm *engine.DataManager, objLimit, indexLimit int, objTTL, indexTTL time.Duration, objStaticTTL, indexStaticTTL bool) (rply *IndexHealthReply, err error) {
// posible errors
missingAP := utils.StringSet{} // the index are present but the action plans are not //missing actionplans
brokenRef := map[string][]string{} // the actionPlans match the index but they are missing the account // broken reference
missingIndex := map[string][]string{} // the indexes are not present but the action plans points to that account // misingAccounts
// local cache
indexesCache := ltcache.NewCache(objLimit, objTTL, objStaticTTL, nil)
objectsCache := ltcache.NewCache(indexLimit, indexTTL, indexStaticTTL, nil)
getCachedIndex := func(acntID string) (apIDs []string, err error) {
if x, ok := indexesCache.Get(acntID); ok {
if x == nil {
return nil, utils.ErrNotFound
}
return x.([]string), nil
}
if apIDs, err = dm.GetAccountActionPlans(acntID, true, false, utils.NonTransactional); err != nil { // read from cache but do not write if not there
if err == utils.ErrNotFound {
indexesCache.Set(acntID, nil, nil)
}
return
}
indexesCache.Set(acntID, apIDs, nil)
return
}
getCachedObject := func(apID string) (obj *engine.ActionPlan, err error) {
if x, ok := objectsCache.Get(apID); ok {
if x == nil {
return nil, utils.ErrNotFound
}
return x.(*engine.ActionPlan), nil
}
if obj, err = dm.GetActionPlan(apID, true, false, utils.NonTransactional); err != nil { // read from cache but do not write if not there
if err == utils.ErrNotFound {
objectsCache.Set(apID, nil, nil)
}
return
}
objectsCache.Set(apID, obj, nil)
return
}
var acntIDs []string // start with the indexes and check the references
if acntIDs, err = dm.DataDB().GetKeysForPrefix(utils.AccountActionPlansPrefix); err != nil {
err = fmt.Errorf("error <%s> querying keys for accountActionPlans", err.Error())
return
}
for _, acntID := range acntIDs {
acntID = strings.TrimPrefix(acntID, utils.AccountActionPlansPrefix) //
var apIDs []string
if apIDs, err = getCachedIndex(acntID); err != nil { // read from cache but do not write if not there
err = fmt.Errorf("error <%s> querying the accountActionPlan: <%v>", err.Error(), acntID)
return
}
for _, apID := range apIDs {
var ap *engine.ActionPlan
if ap, err = getCachedObject(apID); err != nil {
if err != utils.ErrNotFound {
err = fmt.Errorf("error <%s> querying the actionPlan: <%v>", err.Error(), apID)
return
}
missingAP.Add(apID) // not found
continue
}
if !ap.AccountIDs.HasKey(acntID) { // the action plan exists but doesn't point towards the account we have index
brokenRef[apID] = append(brokenRef[apID], acntID)
}
}
}
var apIDs []string // we have all the indexes in cache now do a reverse check
if apIDs, err = dm.DataDB().GetKeysForPrefix(utils.ActionPlanPrefix); err != nil {
err = fmt.Errorf("error <%s> querying keys for actionPlans", err.Error())
return
}
for _, apID := range apIDs {
apID = strings.TrimPrefix(apID, utils.ActionPlanPrefix) //
var ap *engine.ActionPlan
if ap, err = getCachedObject(apID); err != nil {
err = fmt.Errorf("error <%s> querying the actionPlan: <%v>", err.Error(), apID)
return
}
for acntID := range ap.AccountIDs {
var ids []string
if ids, err = getCachedIndex(acntID); err != nil { // read from cache but do not write if not there
err = fmt.Errorf("error <%s> querying the accountActionPlan: <%v>", err.Error(), acntID)
return
}
if !utils.IsSliceMember(ids, apID) { // the index doesn't exits for this actionPlan
missingIndex[apID] = append(missingIndex[apID], acntID)
}
}
}
rply = &IndexHealthReply{
MissingObjects: missingAP.AsSlice(),
MissingIndexes: missingIndex,
BrokenReferences: brokenRef,
}
return
}

View File

@@ -0,0 +1,131 @@
// +build integration
/*
Real-time Online/Offline Charging System (OCS) for Telecom & ISP environments
Copyright (C) ITsysCOM GmbH
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FIdxTNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>
*/
package v1
import (
"net/rpc"
"path"
"reflect"
"testing"
"time"
"github.com/cgrates/cgrates/config"
"github.com/cgrates/cgrates/engine"
"github.com/cgrates/cgrates/utils"
)
var (
tFIdxHRpc *rpc.Client
sTestsFilterIndexesSHealth = []func(t *testing.T){
testV1FIdxHLoadConfig,
testV1FIdxHdxInitDataDb,
testV1FIdxHResetStorDb,
testV1FIdxHStartEngine,
testV1FIdxHRpcConn,
testV1FIdxHLoadFromFolder,
testV1FIdxHAccountActionPlansHealth,
testV1FIdxHStopEngine,
}
)
// Test start here
func TestFIdxHealthIT(t *testing.T) {
switch *dbType {
case utils.MetaInternal:
tSv1ConfDIR = "tutinternal"
case utils.MetaMySQL:
tSv1ConfDIR = "tutmysql"
case utils.MetaMongo:
tSv1ConfDIR = "tutmongo"
case utils.MetaPostgres:
t.SkipNow()
default:
t.Fatal("Unknown Database type")
}
for _, stest := range sTestsFilterIndexesSHealth {
t.Run(tSv1ConfDIR, stest)
}
}
func testV1FIdxHLoadConfig(t *testing.T) {
tSv1CfgPath = path.Join(*dataDir, "conf", "samples", tSv1ConfDIR)
var err error
if tSv1Cfg, err = config.NewCGRConfigFromPath(tSv1CfgPath); err != nil {
t.Error(err)
}
}
func testV1FIdxHdxInitDataDb(t *testing.T) {
if err := engine.InitDataDb(tSv1Cfg); err != nil {
t.Fatal(err)
}
}
// Wipe out the cdr database
func testV1FIdxHResetStorDb(t *testing.T) {
if err := engine.InitStorDb(tSv1Cfg); err != nil {
t.Fatal(err)
}
}
func testV1FIdxHStartEngine(t *testing.T) {
if _, err := engine.StopStartEngine(tSv1CfgPath, *waitRater); err != nil {
t.Fatal(err)
}
}
func testV1FIdxHRpcConn(t *testing.T) {
var err error
tFIdxHRpc, err = newRPCClient(tSv1Cfg.ListenCfg()) // We connect over JSON so we can also troubleshoot if needed
if err != nil {
t.Fatal("Could not connect to rater: ", err.Error())
}
}
func testV1FIdxHLoadFromFolder(t *testing.T) {
var reply string
attrs := &utils.AttrLoadTpFromFolder{FolderPath: path.Join(*dataDir, "tariffplans", "tutorial")}
if err := tFIdxHRpc.Call(utils.APIerSv1LoadTariffPlanFromFolder, attrs, &reply); err != nil {
t.Error(err)
}
time.Sleep(100 * time.Millisecond)
}
func testV1FIdxHAccountActionPlansHealth(t *testing.T) {
var reply engine.IndexHealthReply
if err := tFIdxHRpc.Call(utils.APIerSv1GetAccountActionPlansIndexHealth, engine.IndexHealthArgs{
IndexCacheLimit: -1,
ObjectCacheLimit: -1,
}, &reply); err != nil {
t.Error(err)
}
exp := engine.IndexHealthReply{}
if !reflect.DeepEqual(exp, reply) {
t.Errorf("Expecting: %+v, received: %+v", utils.ToJSON(exp), utils.ToJSON(reply))
}
}
func testV1FIdxHStopEngine(t *testing.T) {
if err := engine.KillEngine(100); err != nil {
t.Error(err)
}
}

View File

@@ -21,10 +21,12 @@ package engine
import (
"fmt"
"strings"
"time"
"github.com/cgrates/cgrates/config"
"github.com/cgrates/cgrates/guardian"
"github.com/cgrates/cgrates/utils"
"github.com/cgrates/ltcache"
)
var (
@@ -818,3 +820,133 @@ func IsDynamicDPPath(path string) bool {
}
return false
}
type IndexHealthArgs struct {
IndexCacheLimit int
IndexCacheTTL time.Duration
IndexCacheStaticTTL bool
ObjectCacheLimit int
ObjectCacheTTL time.Duration
ObjectCacheStaticTTL bool
}
type IndexHealthReply struct {
MissingObjects []string // list of object that are referenced in indexes but are not found in the dataDB
MissingIndexes map[string][]string // list of missing indexes for each object (the map has the key as the objectID and a list of indexes)
BrokenReferences map[string][]string // list of broken references (the map has the key as the objectID and a list of indexes)
}
// add cache in args API
func GetAccountActionPlanIndexHealth(dm *DataManager, objLimit, indexLimit int, objTTL, indexTTL time.Duration, objStaticTTL, indexStaticTTL bool) (rply *IndexHealthReply, err error) {
// posible errors
missingAP := utils.StringSet{} // the index are present but the action plans are not //missing actionplans
brokenRef := map[string][]string{} // the actionPlans match the index but they are missing the account // broken reference
missingIndex := map[string][]string{} // the indexes are not present but the action plans points to that account // misingAccounts
// local cache
indexesCache := ltcache.NewCache(objLimit, objTTL, objStaticTTL, nil)
objectsCache := ltcache.NewCache(indexLimit, indexTTL, indexStaticTTL, nil)
getCachedIndex := func(acntID string) (apIDs []string, err error) {
if x, ok := indexesCache.Get(acntID); ok {
if x == nil {
return nil, utils.ErrNotFound
}
return x.([]string), nil
}
if apIDs, err = dm.GetAccountActionPlans(acntID, true, false, utils.NonTransactional); err != nil { // read from cache but do not write if not there
if err == utils.ErrNotFound {
indexesCache.Set(acntID, nil, nil)
}
return
}
indexesCache.Set(acntID, apIDs, nil)
return
}
getCachedObject := func(apID string) (obj *ActionPlan, err error) {
if x, ok := objectsCache.Get(apID); ok {
if x == nil {
return nil, utils.ErrNotFound
}
return x.(*ActionPlan), nil
}
if obj, err = dm.GetActionPlan(apID, true, false, utils.NonTransactional); err != nil { // read from cache but do not write if not there
if err == utils.ErrNotFound {
objectsCache.Set(apID, nil, nil)
}
return
}
objectsCache.Set(apID, obj, nil)
return
}
var acntIDs []string // start with the indexes and check the references
if acntIDs, err = dm.DataDB().GetKeysForPrefix(utils.AccountActionPlansPrefix); err != nil {
err = fmt.Errorf("error <%s> querying keys for accountActionPlans", err.Error())
return
}
for _, acntID := range acntIDs {
acntID = strings.TrimPrefix(acntID, utils.AccountActionPlansPrefix) //
var apIDs []string
if apIDs, err = getCachedIndex(acntID); err != nil { // read from cache but do not write if not there
err = fmt.Errorf("error <%s> querying the accountActionPlan: <%v>", err.Error(), acntID)
return
}
for _, apID := range apIDs {
var ap *ActionPlan
if ap, err = getCachedObject(apID); err != nil {
if err != utils.ErrNotFound {
err = fmt.Errorf("error <%s> querying the actionPlan: <%v>", err.Error(), apID)
return
}
err = nil
missingAP.Add(apID) // not found
continue
}
if !ap.AccountIDs.HasKey(acntID) { // the action plan exists but doesn't point towards the account we have index
brokenRef[apID] = append(brokenRef[apID], acntID)
}
}
}
var apIDs []string // we have all the indexes in cache now do a reverse check
if apIDs, err = dm.DataDB().GetKeysForPrefix(utils.ActionPlanPrefix); err != nil {
err = fmt.Errorf("error <%s> querying keys for actionPlans", err.Error())
return
}
for _, apID := range apIDs {
apID = strings.TrimPrefix(apID, utils.ActionPlanPrefix) //
var ap *ActionPlan
if ap, err = getCachedObject(apID); err != nil {
err = fmt.Errorf("error <%s> querying the actionPlan: <%v>", err.Error(), apID)
return
}
for acntID := range ap.AccountIDs {
var ids []string
if ids, err = getCachedIndex(acntID); err != nil { // read from cache but do not write if not there
if err != utils.ErrNotFound {
err = fmt.Errorf("error <%s> querying the accountActionPlan: <%v>", err.Error(), acntID)
return
}
err = nil
brokenRef[apID] = append(brokenRef[apID], acntID)
continue
}
if !utils.IsSliceMember(ids, apID) { // the index doesn't exits for this actionPlan
missingIndex[apID] = append(missingIndex[apID], acntID)
}
}
}
rply = &IndexHealthReply{
MissingObjects: missingAP.AsSlice(),
MissingIndexes: missingIndex,
BrokenReferences: brokenRef,
}
return
}

View File

@@ -0,0 +1,45 @@
/*
Real-time Online/Offline Charging System (OCS) for Telecom & ISP environments
Copyright (C) ITsysCOM GmbH
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>
*/
package engine
/*
func TestHealthAccountAction(t *testing.T) {
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
db := NewInternalDB(nil, nil, true)
dm := NewDataManager(db, cfg.CacheCfg(), nil)
if err := dm.SetAccountActionPlans("1001", []string{"AP1", "AP2"}, true); err != nil {
t.Fatal(err)
}
if err := dm.SetActionPlan("AP2", &ActionPlan{
Id: "AP2",
AccountIDs: utils.NewStringMap("1002"),
ActionTimings: []*ActionTiming{{}},
}, true, utils.NonTransactional); err != nil {
t.Fatal(err)
}
if rply, err := GetAccountActionPlanIndexHealth(dm, -1, -1, -1, -1, false, false); err != nil {
t.Fatal(err)
} else {
t.Error(utils.ToJSON(rply))
}
}
*/

View File

@@ -1269,173 +1269,174 @@ const (
// APIerSv1 APIs
const (
ApierV1 = "ApierV1"
ApierV2 = "ApierV2"
APIerSv1 = "APIerSv1"
APIerSv1ComputeFilterIndexes = "APIerSv1.ComputeFilterIndexes"
APIerSv1ComputeFilterIndexIDs = "APIerSv1.ComputeFilterIndexIDs"
APIerSv1Ping = "APIerSv1.Ping"
APIerSv1SetDispatcherProfile = "APIerSv1.SetDispatcherProfile"
APIerSv1GetDispatcherProfile = "APIerSv1.GetDispatcherProfile"
APIerSv1GetDispatcherProfileIDs = "APIerSv1.GetDispatcherProfileIDs"
APIerSv1RemoveDispatcherProfile = "APIerSv1.RemoveDispatcherProfile"
APIerSv1SetBalances = "APIerSv1.SetBalances"
APIerSv1SetDispatcherHost = "APIerSv1.SetDispatcherHost"
APIerSv1GetDispatcherHost = "APIerSv1.GetDispatcherHost"
APIerSv1GetDispatcherHostIDs = "APIerSv1.GetDispatcherHostIDs"
APIerSv1RemoveDispatcherHost = "APIerSv1.RemoveDispatcherHost"
APIerSv1GetEventCost = "APIerSv1.GetEventCost"
APIerSv1LoadTariffPlanFromFolder = "APIerSv1.LoadTariffPlanFromFolder"
APIerSv1ExportToFolder = "APIerSv1.ExportToFolder"
APIerSv1GetCost = "APIerSv1.GetCost"
APIerSv1SetBalance = "APIerSv1.SetBalance"
APIerSv1GetFilter = "APIerSv1.GetFilter"
APIerSv1GetFilterIndexes = "APIerSv1.GetFilterIndexes"
APIerSv1RemoveFilterIndexes = "APIerSv1.RemoveFilterIndexes"
APIerSv1RemoveFilter = "APIerSv1.RemoveFilter"
APIerSv1SetFilter = "APIerSv1.SetFilter"
APIerSv1GetFilterIDs = "APIerSv1.GetFilterIDs"
APIerSv1GetRatingProfile = "APIerSv1.GetRatingProfile"
APIerSv1RemoveRatingProfile = "APIerSv1.RemoveRatingProfile"
APIerSv1SetRatingProfile = "APIerSv1.SetRatingProfile"
APIerSv1GetRatingProfileIDs = "APIerSv1.GetRatingProfileIDs"
APIerSv1SetDataDBVersions = "APIerSv1.SetDataDBVersions"
APIerSv1SetStorDBVersions = "APIerSv1.SetStorDBVersions"
APIerSv1GetAccountActionPlan = "APIerSv1.GetAccountActionPlan"
APIerSv1ComputeActionPlanIndexes = "APIerSv1.ComputeActionPlanIndexes"
APIerSv1GetActions = "APIerSv1.GetActions"
APIerSv1GetActionPlan = "APIerSv1.GetActionPlan"
APIerSv1GetActionPlanIDs = "APIerSv1.GetActionPlanIDs"
APIerSv1GetRatingPlanIDs = "APIerSv1.GetRatingPlanIDs"
APIerSv1GetRatingPlan = "APIerSv1.GetRatingPlan"
APIerSv1RemoveRatingPlan = "APIerSv1.RemoveRatingPlan"
APIerSv1GetDestination = "APIerSv1.GetDestination"
APIerSv1RemoveDestination = "APIerSv1.RemoveDestination"
APIerSv1GetReverseDestination = "APIerSv1.GetReverseDestination"
APIerSv1AddBalance = "APIerSv1.AddBalance"
APIerSv1DebitBalance = "APIerSv1.DebitBalance"
APIerSv1SetAccount = "APIerSv1.SetAccount"
APIerSv1GetAccountsCount = "APIerSv1.GetAccountsCount"
APIerSv1GetDataDBVersions = "APIerSv1.GetDataDBVersions"
APIerSv1GetStorDBVersions = "APIerSv1.GetStorDBVersions"
APIerSv1GetCDRs = "APIerSv1.GetCDRs"
APIerSv1GetTPAccountActions = "APIerSv1.GetTPAccountActions"
APIerSv1SetTPAccountActions = "APIerSv1.SetTPAccountActions"
APIerSv1GetTPAccountActionsByLoadId = "APIerSv1.GetTPAccountActionsByLoadId"
APIerSv1GetTPAccountActionLoadIds = "APIerSv1.GetTPAccountActionLoadIds"
APIerSv1GetTPAccountActionIds = "APIerSv1.GetTPAccountActionIds"
APIerSv1RemoveTPAccountActions = "APIerSv1.RemoveTPAccountActions"
APIerSv1GetTPActionPlan = "APIerSv1.GetTPActionPlan"
APIerSv1SetTPActionPlan = "APIerSv1.SetTPActionPlan"
APIerSv1GetTPActionPlanIds = "APIerSv1.GetTPActionPlanIds"
APIerSv1SetTPActionTriggers = "APIerSv1.SetTPActionTriggers"
APIerSv1GetTPActionTriggers = "APIerSv1.GetTPActionTriggers"
APIerSv1RemoveTPActionTriggers = "APIerSv1.RemoveTPActionTriggers"
APIerSv1GetTPActionTriggerIds = "APIerSv1.GetTPActionTriggerIds"
APIerSv1GetTPActions = "APIerSv1.GetTPActions"
APIerSv1RemoveTPActionPlan = "APIerSv1.RemoveTPActionPlan"
APIerSv1GetTPAttributeProfile = "APIerSv1.GetTPAttributeProfile"
APIerSv1SetTPAttributeProfile = "APIerSv1.SetTPAttributeProfile"
APIerSv1GetTPAttributeProfileIds = "APIerSv1.GetTPAttributeProfileIds"
APIerSv1RemoveTPAttributeProfile = "APIerSv1.RemoveTPAttributeProfile"
APIerSv1GetTPCharger = "APIerSv1.GetTPCharger"
APIerSv1SetTPCharger = "APIerSv1.SetTPCharger"
APIerSv1RemoveTPCharger = "APIerSv1.RemoveTPCharger"
APIerSv1GetTPChargerIDs = "APIerSv1.GetTPChargerIDs"
APIerSv1SetTPFilterProfile = "APIerSv1.SetTPFilterProfile"
APIerSv1GetTPFilterProfile = "APIerSv1.GetTPFilterProfile"
APIerSv1GetTPFilterProfileIds = "APIerSv1.GetTPFilterProfileIds"
APIerSv1RemoveTPFilterProfile = "APIerSv1.RemoveTPFilterProfile"
APIerSv1GetTPDestination = "APIerSv1.GetTPDestination"
APIerSv1SetTPDestination = "APIerSv1.SetTPDestination"
APIerSv1GetTPDestinationIDs = "APIerSv1.GetTPDestinationIDs"
APIerSv1RemoveTPDestination = "APIerSv1.RemoveTPDestination"
APIerSv1GetTPResource = "APIerSv1.GetTPResource"
APIerSv1SetTPResource = "APIerSv1.SetTPResource"
APIerSv1RemoveTPResource = "APIerSv1.RemoveTPResource"
APIerSv1SetTPRate = "APIerSv1.SetTPRate"
APIerSv1GetTPRate = "APIerSv1.GetTPRate"
APIerSv1RemoveTPRate = "APIerSv1.RemoveTPRate"
APIerSv1GetTPRateIds = "APIerSv1.GetTPRateIds"
APIerSv1SetTPThreshold = "APIerSv1.SetTPThreshold"
APIerSv1GetTPThreshold = "APIerSv1.GetTPThreshold"
APIerSv1GetTPThresholdIDs = "APIerSv1.GetTPThresholdIDs"
APIerSv1RemoveTPThreshold = "APIerSv1.RemoveTPThreshold"
APIerSv1SetTPStat = "APIerSv1.SetTPStat"
APIerSv1GetTPStat = "APIerSv1.GetTPStat"
APIerSv1RemoveTPStat = "APIerSv1.RemoveTPStat"
APIerSv1GetTPDestinationRate = "APIerSv1.GetTPDestinationRate"
APIerSv1SetTPRouteProfile = "APIerSv1.SetTPRouteProfile"
APIerSv1GetTPRouteProfile = "APIerSv1.GetTPRouteProfile"
APIerSv1GetTPRouteProfileIDs = "APIerSv1.GetTPRouteProfileIDs"
APIerSv1RemoveTPRouteProfile = "APIerSv1.RemoveTPRouteProfile"
APIerSv1GetTPDispatcherProfile = "APIerSv1.GetTPDispatcherProfile"
APIerSv1SetTPDispatcherProfile = "APIerSv1.SetTPDispatcherProfile"
APIerSv1RemoveTPDispatcherProfile = "APIerSv1.RemoveTPDispatcherProfile"
APIerSv1GetTPDispatcherProfileIDs = "APIerSv1.GetTPDispatcherProfileIDs"
APIerSv1GetTPSharedGroups = "APIerSv1.GetTPSharedGroups"
APIerSv1SetTPSharedGroups = "APIerSv1.SetTPSharedGroups"
APIerSv1GetTPSharedGroupIds = "APIerSv1.GetTPSharedGroupIds"
APIerSv1RemoveTPSharedGroups = "APIerSv1.RemoveTPSharedGroups"
APIerSv1ExportCDRs = "APIerSv1.ExportCDRs"
APIerSv1GetTPRatingPlan = "APIerSv1.GetTPRatingPlan"
APIerSv1SetTPRatingPlan = "APIerSv1.SetTPRatingPlan"
APIerSv1GetTPRatingPlanIds = "APIerSv1.GetTPRatingPlanIds"
APIerSv1RemoveTPRatingPlan = "APIerSv1.RemoveTPRatingPlan"
APIerSv1SetTPActions = "APIerSv1.SetTPActions"
APIerSv1GetTPActionIds = "APIerSv1.GetTPActionIds"
APIerSv1RemoveTPActions = "APIerSv1.RemoveTPActions"
APIerSv1SetActionPlan = "APIerSv1.SetActionPlan"
APIerSv1ExecuteAction = "APIerSv1.ExecuteAction"
APIerSv1SetTPRatingProfile = "APIerSv1.SetTPRatingProfile"
APIerSv1GetTPRatingProfile = "APIerSv1.GetTPRatingProfile"
APIerSv1RemoveTPRatingProfile = "APIerSv1.RemoveTPRatingProfile"
APIerSv1SetTPDestinationRate = "APIerSv1.SetTPDestinationRate"
APIerSv1GetTPRatingProfileLoadIds = "APIerSv1.GetTPRatingProfileLoadIds"
APIerSv1GetTPRatingProfilesByLoadID = "APIerSv1.GetTPRatingProfilesByLoadID"
APIerSv1GetTPRatingProfileIds = "APIerSv1.GetTPRatingProfileIds"
APIerSv1GetTPDestinationRateIds = "APIerSv1.GetTPDestinationRateIds"
APIerSv1RemoveTPDestinationRate = "APIerSv1.RemoveTPDestinationRate"
APIerSv1ImportTariffPlanFromFolder = "APIerSv1.ImportTariffPlanFromFolder"
APIerSv1ExportTPToFolder = "APIerSv1.ExportTPToFolder"
APIerSv1LoadRatingPlan = "APIerSv1.LoadRatingPlan"
APIerSv1LoadRatingProfile = "APIerSv1.LoadRatingProfile"
APIerSv1LoadAccountActions = "APIerSv1.LoadAccountActions"
APIerSv1SetActions = "APIerSv1.SetActions"
APIerSv1AddTriggeredAction = "APIerSv1.AddTriggeredAction"
APIerSv1GetAccountActionTriggers = "APIerSv1.GetAccountActionTriggers"
APIerSv1AddAccountActionTriggers = "APIerSv1.AddAccountActionTriggers"
APIerSv1ResetAccountActionTriggers = "APIerSv1.ResetAccountActionTriggers"
APIerSv1SetAccountActionTriggers = "APIerSv1.SetAccountActionTriggers"
APIerSv1RemoveAccountActionTriggers = "APIerSv1.RemoveAccountActionTriggers"
APIerSv1GetScheduledActions = "APIerSv1.GetScheduledActions"
APIerSv1RemoveActionTiming = "APIerSv1.RemoveActionTiming"
APIerSv1ComputeReverseDestinations = "APIerSv1.ComputeReverseDestinations"
APIerSv1ComputeAccountActionPlans = "APIerSv1.ComputeAccountActionPlans"
APIerSv1SetDestination = "APIerSv1.SetDestination"
APIerSv1GetDataCost = "APIerSv1.GetDataCost"
APIerSv1ReplayFailedPosts = "APIerSv1.ReplayFailedPosts"
APIerSv1RemoveAccount = "APIerSv1.RemoveAccount"
APIerSv1DebitUsage = "APIerSv1.DebitUsage"
APIerSv1GetCacheStats = "APIerSv1.GetCacheStats"
APIerSv1ReloadCache = "APIerSv1.ReloadCache"
APIerSv1GetActionTriggers = "APIerSv1.GetActionTriggers"
APIerSv1SetActionTrigger = "APIerSv1.SetActionTrigger"
APIerSv1RemoveActionPlan = "APIerSv1.RemoveActionPlan"
APIerSv1RemoveActions = "APIerSv1.RemoveActions"
APIerSv1RemoveBalances = "APIerSv1.RemoveBalances"
APIerSv1GetLoadHistory = "APIerSv1.GetLoadHistory"
APIerSv1GetLoadIDs = "APIerSv1.GetLoadIDs"
APIerSv1GetLoadTimes = "APIerSv1.GetLoadTimes"
APIerSv1ExecuteScheduledActions = "APIerSv1.ExecuteScheduledActions"
APIerSv1GetSharedGroup = "APIerSv1.GetSharedGroup"
APIerSv1RemoveActionTrigger = "APIerSv1.RemoveActionTrigger"
APIerSv1GetAccount = "APIerSv1.GetAccount"
APIerSv1GetAttributeProfileCount = "APIerSv1.GetAttributeProfileCount"
APIerSv1GetMaxUsage = "APIerSv1.GetMaxUsage"
APIerSv1GetTiming = "APIerSv1.GetTiming"
APIerSv1SetTiming = "APIerSv1.SetTiming"
APIerSv1RemoveTiming = "APIerSv1.RemoveTiming"
ApierV1 = "ApierV1"
ApierV2 = "ApierV2"
APIerSv1 = "APIerSv1"
APIerSv1ComputeFilterIndexes = "APIerSv1.ComputeFilterIndexes"
APIerSv1ComputeFilterIndexIDs = "APIerSv1.ComputeFilterIndexIDs"
APIerSv1GetAccountActionPlansIndexHealth = "APIerSv1.GetAccountActionPlansIndexHealth"
APIerSv1Ping = "APIerSv1.Ping"
APIerSv1SetDispatcherProfile = "APIerSv1.SetDispatcherProfile"
APIerSv1GetDispatcherProfile = "APIerSv1.GetDispatcherProfile"
APIerSv1GetDispatcherProfileIDs = "APIerSv1.GetDispatcherProfileIDs"
APIerSv1RemoveDispatcherProfile = "APIerSv1.RemoveDispatcherProfile"
APIerSv1SetBalances = "APIerSv1.SetBalances"
APIerSv1SetDispatcherHost = "APIerSv1.SetDispatcherHost"
APIerSv1GetDispatcherHost = "APIerSv1.GetDispatcherHost"
APIerSv1GetDispatcherHostIDs = "APIerSv1.GetDispatcherHostIDs"
APIerSv1RemoveDispatcherHost = "APIerSv1.RemoveDispatcherHost"
APIerSv1GetEventCost = "APIerSv1.GetEventCost"
APIerSv1LoadTariffPlanFromFolder = "APIerSv1.LoadTariffPlanFromFolder"
APIerSv1ExportToFolder = "APIerSv1.ExportToFolder"
APIerSv1GetCost = "APIerSv1.GetCost"
APIerSv1SetBalance = "APIerSv1.SetBalance"
APIerSv1GetFilter = "APIerSv1.GetFilter"
APIerSv1GetFilterIndexes = "APIerSv1.GetFilterIndexes"
APIerSv1RemoveFilterIndexes = "APIerSv1.RemoveFilterIndexes"
APIerSv1RemoveFilter = "APIerSv1.RemoveFilter"
APIerSv1SetFilter = "APIerSv1.SetFilter"
APIerSv1GetFilterIDs = "APIerSv1.GetFilterIDs"
APIerSv1GetRatingProfile = "APIerSv1.GetRatingProfile"
APIerSv1RemoveRatingProfile = "APIerSv1.RemoveRatingProfile"
APIerSv1SetRatingProfile = "APIerSv1.SetRatingProfile"
APIerSv1GetRatingProfileIDs = "APIerSv1.GetRatingProfileIDs"
APIerSv1SetDataDBVersions = "APIerSv1.SetDataDBVersions"
APIerSv1SetStorDBVersions = "APIerSv1.SetStorDBVersions"
APIerSv1GetAccountActionPlan = "APIerSv1.GetAccountActionPlan"
APIerSv1ComputeActionPlanIndexes = "APIerSv1.ComputeActionPlanIndexes"
APIerSv1GetActions = "APIerSv1.GetActions"
APIerSv1GetActionPlan = "APIerSv1.GetActionPlan"
APIerSv1GetActionPlanIDs = "APIerSv1.GetActionPlanIDs"
APIerSv1GetRatingPlanIDs = "APIerSv1.GetRatingPlanIDs"
APIerSv1GetRatingPlan = "APIerSv1.GetRatingPlan"
APIerSv1RemoveRatingPlan = "APIerSv1.RemoveRatingPlan"
APIerSv1GetDestination = "APIerSv1.GetDestination"
APIerSv1RemoveDestination = "APIerSv1.RemoveDestination"
APIerSv1GetReverseDestination = "APIerSv1.GetReverseDestination"
APIerSv1AddBalance = "APIerSv1.AddBalance"
APIerSv1DebitBalance = "APIerSv1.DebitBalance"
APIerSv1SetAccount = "APIerSv1.SetAccount"
APIerSv1GetAccountsCount = "APIerSv1.GetAccountsCount"
APIerSv1GetDataDBVersions = "APIerSv1.GetDataDBVersions"
APIerSv1GetStorDBVersions = "APIerSv1.GetStorDBVersions"
APIerSv1GetCDRs = "APIerSv1.GetCDRs"
APIerSv1GetTPAccountActions = "APIerSv1.GetTPAccountActions"
APIerSv1SetTPAccountActions = "APIerSv1.SetTPAccountActions"
APIerSv1GetTPAccountActionsByLoadId = "APIerSv1.GetTPAccountActionsByLoadId"
APIerSv1GetTPAccountActionLoadIds = "APIerSv1.GetTPAccountActionLoadIds"
APIerSv1GetTPAccountActionIds = "APIerSv1.GetTPAccountActionIds"
APIerSv1RemoveTPAccountActions = "APIerSv1.RemoveTPAccountActions"
APIerSv1GetTPActionPlan = "APIerSv1.GetTPActionPlan"
APIerSv1SetTPActionPlan = "APIerSv1.SetTPActionPlan"
APIerSv1GetTPActionPlanIds = "APIerSv1.GetTPActionPlanIds"
APIerSv1SetTPActionTriggers = "APIerSv1.SetTPActionTriggers"
APIerSv1GetTPActionTriggers = "APIerSv1.GetTPActionTriggers"
APIerSv1RemoveTPActionTriggers = "APIerSv1.RemoveTPActionTriggers"
APIerSv1GetTPActionTriggerIds = "APIerSv1.GetTPActionTriggerIds"
APIerSv1GetTPActions = "APIerSv1.GetTPActions"
APIerSv1RemoveTPActionPlan = "APIerSv1.RemoveTPActionPlan"
APIerSv1GetTPAttributeProfile = "APIerSv1.GetTPAttributeProfile"
APIerSv1SetTPAttributeProfile = "APIerSv1.SetTPAttributeProfile"
APIerSv1GetTPAttributeProfileIds = "APIerSv1.GetTPAttributeProfileIds"
APIerSv1RemoveTPAttributeProfile = "APIerSv1.RemoveTPAttributeProfile"
APIerSv1GetTPCharger = "APIerSv1.GetTPCharger"
APIerSv1SetTPCharger = "APIerSv1.SetTPCharger"
APIerSv1RemoveTPCharger = "APIerSv1.RemoveTPCharger"
APIerSv1GetTPChargerIDs = "APIerSv1.GetTPChargerIDs"
APIerSv1SetTPFilterProfile = "APIerSv1.SetTPFilterProfile"
APIerSv1GetTPFilterProfile = "APIerSv1.GetTPFilterProfile"
APIerSv1GetTPFilterProfileIds = "APIerSv1.GetTPFilterProfileIds"
APIerSv1RemoveTPFilterProfile = "APIerSv1.RemoveTPFilterProfile"
APIerSv1GetTPDestination = "APIerSv1.GetTPDestination"
APIerSv1SetTPDestination = "APIerSv1.SetTPDestination"
APIerSv1GetTPDestinationIDs = "APIerSv1.GetTPDestinationIDs"
APIerSv1RemoveTPDestination = "APIerSv1.RemoveTPDestination"
APIerSv1GetTPResource = "APIerSv1.GetTPResource"
APIerSv1SetTPResource = "APIerSv1.SetTPResource"
APIerSv1RemoveTPResource = "APIerSv1.RemoveTPResource"
APIerSv1SetTPRate = "APIerSv1.SetTPRate"
APIerSv1GetTPRate = "APIerSv1.GetTPRate"
APIerSv1RemoveTPRate = "APIerSv1.RemoveTPRate"
APIerSv1GetTPRateIds = "APIerSv1.GetTPRateIds"
APIerSv1SetTPThreshold = "APIerSv1.SetTPThreshold"
APIerSv1GetTPThreshold = "APIerSv1.GetTPThreshold"
APIerSv1GetTPThresholdIDs = "APIerSv1.GetTPThresholdIDs"
APIerSv1RemoveTPThreshold = "APIerSv1.RemoveTPThreshold"
APIerSv1SetTPStat = "APIerSv1.SetTPStat"
APIerSv1GetTPStat = "APIerSv1.GetTPStat"
APIerSv1RemoveTPStat = "APIerSv1.RemoveTPStat"
APIerSv1GetTPDestinationRate = "APIerSv1.GetTPDestinationRate"
APIerSv1SetTPRouteProfile = "APIerSv1.SetTPRouteProfile"
APIerSv1GetTPRouteProfile = "APIerSv1.GetTPRouteProfile"
APIerSv1GetTPRouteProfileIDs = "APIerSv1.GetTPRouteProfileIDs"
APIerSv1RemoveTPRouteProfile = "APIerSv1.RemoveTPRouteProfile"
APIerSv1GetTPDispatcherProfile = "APIerSv1.GetTPDispatcherProfile"
APIerSv1SetTPDispatcherProfile = "APIerSv1.SetTPDispatcherProfile"
APIerSv1RemoveTPDispatcherProfile = "APIerSv1.RemoveTPDispatcherProfile"
APIerSv1GetTPDispatcherProfileIDs = "APIerSv1.GetTPDispatcherProfileIDs"
APIerSv1GetTPSharedGroups = "APIerSv1.GetTPSharedGroups"
APIerSv1SetTPSharedGroups = "APIerSv1.SetTPSharedGroups"
APIerSv1GetTPSharedGroupIds = "APIerSv1.GetTPSharedGroupIds"
APIerSv1RemoveTPSharedGroups = "APIerSv1.RemoveTPSharedGroups"
APIerSv1ExportCDRs = "APIerSv1.ExportCDRs"
APIerSv1GetTPRatingPlan = "APIerSv1.GetTPRatingPlan"
APIerSv1SetTPRatingPlan = "APIerSv1.SetTPRatingPlan"
APIerSv1GetTPRatingPlanIds = "APIerSv1.GetTPRatingPlanIds"
APIerSv1RemoveTPRatingPlan = "APIerSv1.RemoveTPRatingPlan"
APIerSv1SetTPActions = "APIerSv1.SetTPActions"
APIerSv1GetTPActionIds = "APIerSv1.GetTPActionIds"
APIerSv1RemoveTPActions = "APIerSv1.RemoveTPActions"
APIerSv1SetActionPlan = "APIerSv1.SetActionPlan"
APIerSv1ExecuteAction = "APIerSv1.ExecuteAction"
APIerSv1SetTPRatingProfile = "APIerSv1.SetTPRatingProfile"
APIerSv1GetTPRatingProfile = "APIerSv1.GetTPRatingProfile"
APIerSv1RemoveTPRatingProfile = "APIerSv1.RemoveTPRatingProfile"
APIerSv1SetTPDestinationRate = "APIerSv1.SetTPDestinationRate"
APIerSv1GetTPRatingProfileLoadIds = "APIerSv1.GetTPRatingProfileLoadIds"
APIerSv1GetTPRatingProfilesByLoadID = "APIerSv1.GetTPRatingProfilesByLoadID"
APIerSv1GetTPRatingProfileIds = "APIerSv1.GetTPRatingProfileIds"
APIerSv1GetTPDestinationRateIds = "APIerSv1.GetTPDestinationRateIds"
APIerSv1RemoveTPDestinationRate = "APIerSv1.RemoveTPDestinationRate"
APIerSv1ImportTariffPlanFromFolder = "APIerSv1.ImportTariffPlanFromFolder"
APIerSv1ExportTPToFolder = "APIerSv1.ExportTPToFolder"
APIerSv1LoadRatingPlan = "APIerSv1.LoadRatingPlan"
APIerSv1LoadRatingProfile = "APIerSv1.LoadRatingProfile"
APIerSv1LoadAccountActions = "APIerSv1.LoadAccountActions"
APIerSv1SetActions = "APIerSv1.SetActions"
APIerSv1AddTriggeredAction = "APIerSv1.AddTriggeredAction"
APIerSv1GetAccountActionTriggers = "APIerSv1.GetAccountActionTriggers"
APIerSv1AddAccountActionTriggers = "APIerSv1.AddAccountActionTriggers"
APIerSv1ResetAccountActionTriggers = "APIerSv1.ResetAccountActionTriggers"
APIerSv1SetAccountActionTriggers = "APIerSv1.SetAccountActionTriggers"
APIerSv1RemoveAccountActionTriggers = "APIerSv1.RemoveAccountActionTriggers"
APIerSv1GetScheduledActions = "APIerSv1.GetScheduledActions"
APIerSv1RemoveActionTiming = "APIerSv1.RemoveActionTiming"
APIerSv1ComputeReverseDestinations = "APIerSv1.ComputeReverseDestinations"
APIerSv1ComputeAccountActionPlans = "APIerSv1.ComputeAccountActionPlans"
APIerSv1SetDestination = "APIerSv1.SetDestination"
APIerSv1GetDataCost = "APIerSv1.GetDataCost"
APIerSv1ReplayFailedPosts = "APIerSv1.ReplayFailedPosts"
APIerSv1RemoveAccount = "APIerSv1.RemoveAccount"
APIerSv1DebitUsage = "APIerSv1.DebitUsage"
APIerSv1GetCacheStats = "APIerSv1.GetCacheStats"
APIerSv1ReloadCache = "APIerSv1.ReloadCache"
APIerSv1GetActionTriggers = "APIerSv1.GetActionTriggers"
APIerSv1SetActionTrigger = "APIerSv1.SetActionTrigger"
APIerSv1RemoveActionPlan = "APIerSv1.RemoveActionPlan"
APIerSv1RemoveActions = "APIerSv1.RemoveActions"
APIerSv1RemoveBalances = "APIerSv1.RemoveBalances"
APIerSv1GetLoadHistory = "APIerSv1.GetLoadHistory"
APIerSv1GetLoadIDs = "APIerSv1.GetLoadIDs"
APIerSv1GetLoadTimes = "APIerSv1.GetLoadTimes"
APIerSv1ExecuteScheduledActions = "APIerSv1.ExecuteScheduledActions"
APIerSv1GetSharedGroup = "APIerSv1.GetSharedGroup"
APIerSv1RemoveActionTrigger = "APIerSv1.RemoveActionTrigger"
APIerSv1GetAccount = "APIerSv1.GetAccount"
APIerSv1GetAttributeProfileCount = "APIerSv1.GetAttributeProfileCount"
APIerSv1GetMaxUsage = "APIerSv1.GetMaxUsage"
APIerSv1GetTiming = "APIerSv1.GetTiming"
APIerSv1SetTiming = "APIerSv1.SetTiming"
APIerSv1RemoveTiming = "APIerSv1.RemoveTiming"
)
// APIerSv1 TP APIs