From b77eb9fd007f18e4440f3f82832bd99c6c6ebd69 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Tue, 29 Jun 2021 17:14:52 +0300 Subject: [PATCH] Added reversedestinationshealth API --- apier/v1/filter_indexes.go | 15 +- apier/v1/filter_indexes_health_it_test.go | 27 +- engine/libindex.go | 165 ++++++++++- engine/z_libindex_health_test.go | 148 +++++++++- utils/consts.go | 337 +++++++++++----------- 5 files changed, 496 insertions(+), 196 deletions(-) diff --git a/apier/v1/filter_indexes.go b/apier/v1/filter_indexes.go index 19eacb210..05bb54ceb 100644 --- a/apier/v1/filter_indexes.go +++ b/apier/v1/filter_indexes.go @@ -592,8 +592,19 @@ func (apierSv1 *APIerSv1) ComputeFilterIndexIDs(args *utils.ArgsComputeFilterInd return nil } -func (apierSv1 *APIerSv1) GetAccountActionPlansIndexHealth(args *engine.IndexHealthArgs, reply *engine.IndexHealthReply) error { - rp, err := engine.GetAccountActionPlanIndexHealth(apierSv1.DataManager, args.ObjectCacheLimit, args.IndexCacheLimit, +func (apierSv1 *APIerSv1) GetAccountActionPlansIndexHealth(args *engine.IndexHealthArgs, reply *engine.AccountActionPlanIHReply) error { + rp, err := engine.GetAccountActionPlansIndexHealth(apierSv1.DataManager, args.ObjectCacheLimit, args.IndexCacheLimit, + args.ObjectCacheTTL, args.IndexCacheTTL, + args.ObjectCacheStaticTTL, args.IndexCacheStaticTTL) + if err != nil { + return err + } + *reply = *rp + return nil +} + +func (apierSv1 *APIerSv1) GetReverseDestinationsIndexHealth(args *engine.IndexHealthArgs, reply *engine.ReverseDestinationsIHReply) error { + rp, err := engine.GetReverseDestinationsIndexHealth(apierSv1.DataManager, args.ObjectCacheLimit, args.IndexCacheLimit, args.ObjectCacheTTL, args.IndexCacheTTL, args.ObjectCacheStaticTTL, args.IndexCacheStaticTTL) if err != nil { diff --git a/apier/v1/filter_indexes_health_it_test.go b/apier/v1/filter_indexes_health_it_test.go index 16c87abc0..6dfb31198 100644 --- a/apier/v1/filter_indexes_health_it_test.go +++ b/apier/v1/filter_indexes_health_it_test.go @@ -42,6 +42,7 @@ var ( testV1FIdxHRpcConn, testV1FIdxHLoadFromFolder, testV1FIdxHAccountActionPlansHealth, + testV1FIdxHReverseDestinationHealth, testV1FIdxHStopEngine, } @@ -111,17 +112,33 @@ func testV1FIdxHLoadFromFolder(t *testing.T) { } func testV1FIdxHAccountActionPlansHealth(t *testing.T) { - var reply engine.IndexHealthReply + var reply engine.AccountActionPlanIHReply if err := tFIdxHRpc.Call(utils.APIerSv1GetAccountActionPlansIndexHealth, engine.IndexHealthArgs{ IndexCacheLimit: -1, ObjectCacheLimit: -1, }, &reply); err != nil { t.Error(err) } - exp := engine.IndexHealthReply{ - MissingObjects: []string{}, - MissingIndexes: map[string][]string{}, - BrokenReferences: map[string][]string{}, + exp := engine.AccountActionPlanIHReply{ + MissingAccountActionPlans: map[string][]string{}, + BrokenReferences: map[string][]string{}, + } + if !reflect.DeepEqual(exp, reply) { + t.Errorf("Expecting: %+v, received: %+v", utils.ToJSON(exp), utils.ToJSON(reply)) + } +} + +func testV1FIdxHReverseDestinationHealth(t *testing.T) { + var reply engine.ReverseDestinationsIHReply + if err := tFIdxHRpc.Call(utils.APIerSv1GetReverseDestinationsIndexHealth, engine.IndexHealthArgs{ + IndexCacheLimit: -1, + ObjectCacheLimit: -1, + }, &reply); err != nil { + t.Error(err) + } + exp := engine.ReverseDestinationsIHReply{ + MissingReverseDestinations: map[string][]string{}, + BrokenReferences: map[string][]string{}, } if !reflect.DeepEqual(exp, reply) { t.Errorf("Expecting: %+v, received: %+v", utils.ToJSON(exp), utils.ToJSON(reply)) diff --git a/engine/libindex.go b/engine/libindex.go index 18ea629d9..678a9cbe2 100644 --- a/engine/libindex.go +++ b/engine/libindex.go @@ -845,9 +845,8 @@ type AccountActionPlanIHReply struct { } // add cache in args API -func GetAccountActionPlanIndexHealth(dm *DataManager, objLimit, indexLimit int, objTTL, indexTTL time.Duration, objStaticTTL, indexStaticTTL bool) (rply *AccountActionPlanIHReply, err error) { +func GetAccountActionPlansIndexHealth(dm *DataManager, objLimit, indexLimit int, objTTL, indexTTL time.Duration, objStaticTTL, indexStaticTTL bool) (rply *AccountActionPlanIHReply, 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 @@ -910,7 +909,7 @@ func GetAccountActionPlanIndexHealth(dm *DataManager, objLimit, indexLimit int, return } err = nil - missingAP.Add(apID) // not found + brokenRef[apID] = nil continue } @@ -941,23 +940,138 @@ func GetAccountActionPlanIndexHealth(dm *DataManager, objLimit, indexLimit int, return } err = nil - missingIndex[apID] = append(missingIndex[apID], acntID) + missingIndex[acntID] = append(missingIndex[acntID], apID) continue } if !utils.IsSliceMember(ids, apID) { // the index doesn't exits for this actionPlan - missingIndex[apID] = append(missingIndex[apID], acntID) + missingIndex[acntID] = append(missingIndex[acntID], apID) } } } rply = &AccountActionPlanIHReply{ - MissingActionPlans: missingAP.AsSlice(), MissingAccountActionPlans: missingIndex, BrokenReferences: brokenRef, } return } +type ReverseDestinationsIHReply struct { + MissingReverseDestinations map[string][]string // list of missing indexes for each object (the map has the key as the indexKey and a list of objects) + 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 GetReverseDestinationsIndexHealth(dm *DataManager, objLimit, indexLimit int, objTTL, indexTTL time.Duration, objStaticTTL, indexStaticTTL bool) (rply *ReverseDestinationsIHReply, err error) { + // posible errors + 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(prefix string) (dstIDs []string, err error) { + if x, ok := indexesCache.Get(prefix); ok { + if x == nil { + return nil, utils.ErrNotFound + } + return x.([]string), nil + } + if dstIDs, err = dm.GetReverseDestination(prefix, true, false, utils.NonTransactional); err != nil { // read from cache but do not write if not there + if err == utils.ErrNotFound { + indexesCache.Set(prefix, nil, nil) + } + return + } + indexesCache.Set(prefix, dstIDs, nil) + return + } + + getCachedObject := func(dstID string) (obj *Destination, err error) { + if x, ok := objectsCache.Get(dstID); ok { + if x == nil { + return nil, utils.ErrNotFound + } + return x.(*Destination), nil + } + if obj, err = dm.GetDestination(dstID, true, false, utils.NonTransactional); err != nil { // read from cache but do not write if not there + if err == utils.ErrNotFound { + objectsCache.Set(dstID, nil, nil) + } + return + } + objectsCache.Set(dstID, obj, nil) + return + } + + var prefixes []string // start with the indexes and check the references + if prefixes, err = dm.DataDB().GetKeysForPrefix(utils.ReverseDestinationPrefix); err != nil { + err = fmt.Errorf("error <%s> querying keys for reverseDestinations", err.Error()) + return + } + + for _, prefix := range prefixes { + prefix = strings.TrimPrefix(prefix, utils.ReverseDestinationPrefix) // + var dstIDs []string + if dstIDs, err = getCachedIndex(prefix); err != nil { // read from cache but do not write if not there + err = fmt.Errorf("error <%s> querying the reverseDestination: <%v>", err.Error(), prefix) + return + } + for _, dstID := range dstIDs { + var dst *Destination + if dst, err = getCachedObject(dstID); err != nil { + if err != utils.ErrNotFound { + err = fmt.Errorf("error <%s> querying the destination: <%v>", err.Error(), dstID) + return + } + err = nil + brokenRef[dstID] = nil + continue + } + if !utils.IsSliceMember(dst.Prefixes, prefix) { // the action plan exists but doesn't point towards the account we have index + brokenRef[dstID] = append(brokenRef[dstID], prefix) + } + } + } + + var dstIDs []string // we have all the indexes in cache now do a reverse check + if dstIDs, err = dm.DataDB().GetKeysForPrefix(utils.DestinationPrefix); err != nil { + err = fmt.Errorf("error <%s> querying keys for destinations", err.Error()) + return + } + + for _, dstID := range dstIDs { + dstID = strings.TrimPrefix(dstID, utils.DestinationPrefix) // + var dst *Destination + if dst, err = getCachedObject(dstID); err != nil { + err = fmt.Errorf("error <%s> querying the destination: <%v>", err.Error(), dstID) + return + } + for _, prefix := range dst.Prefixes { + var ids []string + if ids, err = getCachedIndex(prefix); err != nil { // read from cache but do not write if not there + if err != utils.ErrNotFound { + err = fmt.Errorf("error <%s> querying the reverseDestination: <%v>", err.Error(), prefix) + return + } + err = nil + missingIndex[prefix] = append(missingIndex[prefix], dstID) + continue + } + if !utils.IsSliceMember(ids, dstID) { // the index doesn't exits for this actionPlan + missingIndex[prefix] = append(missingIndex[prefix], dstID) + } + } + } + + rply = &ReverseDestinationsIHReply{ + MissingReverseDestinations: missingIndex, + BrokenReferences: brokenRef, + } + return +} + func getFiltersAndContexts(dm *DataManager, indxType, tnt, id string) (filterIDs, contexts []string, err error) { // add contexts switch indxType { case utils.CacheResourceFilterIndexes: @@ -1016,7 +1130,6 @@ type FilterIHReply struct { MissingFilters map[string][]string // list of broken references (the map has the key as the filterID and a list of objectIDs) } -/* func GetFilterIndexHealth(dm *DataManager, indxType string, objLimit, indexLimit int, objTTL, indexTTL time.Duration, objStaticTTL, indexStaticTTL bool) (rply *FilterIHReply, err error) { @@ -1074,7 +1187,39 @@ func GetFilterIndexHealth(dm *DataManager, indxType string, return } for idxKey, idx := range indexes { - for itmID:=range idx{} + for itmID := range idx { + var filterIDs, contexts []string + if filterIDs, contexts, err = getFiltersAndContexts(dm, indxType, tnt, itmID); err != nil { + if err != utils.ErrNotFound { + return + } + rply.MissingObjects = append(rply.MissingObjects, utils.ConcatenatedKey(tnt, itmID)) + continue + } + if ctx != nil && !utils.IsSliceMember(contexts, *ctx) { + key := utils.ConcatenatedKey(tntCtx, idxKey) + rply.MissingIndexes[key] = append(rply.MissingIndexes[key], itmID) + continue + } + for _, fltrID := range filterIDs { + var fltr *Filter + if fltr, err = dm.GetFilter(tnt, fltrID, + true, false, utils.NonTransactional); err != nil { + if err != utils.ErrNotFound { + return + } + rply.MissingFilters[fltrID] = append(rply.MissingFilters[fltrID], itmID) + } + indexes := map[string]utils.StringSet{} + if indexes, err = addFilterToIndexSet(dm, indxType, tntCtx, fltr, indexes); err != nil { + return + } + if idx, has := indexes[idxKey]; !has || !idx.Has(itmID) { + key := utils.ConcatenatedKey(tntCtx, idxKey) + rply.MissingIndexes[key] = append(rply.MissingIndexes[key], itmID) + } + } + } } } return @@ -1100,10 +1245,10 @@ func updateFilterIH(dm *DataManager, filterIDs []string, indxType, tnt, tntCtx, } for key, idx := range indexes { if !idx.Has(itmID) { - rply.MissingIndexes[itmID] = append(rply.MissingIndexes[itmID], key) + key = utils.ConcatenatedKey(tntCtx, key) + rply.MissingIndexes[key] = append(rply.MissingIndexes[key], itmID) } } } return rply, nil } -*/ diff --git a/engine/z_libindex_health_test.go b/engine/z_libindex_health_test.go index 68c2cb162..5e1529260 100644 --- a/engine/z_libindex_health_test.go +++ b/engine/z_libindex_health_test.go @@ -44,10 +44,10 @@ func TestHealthAccountAction(t *testing.T) { } exp := &AccountActionPlanIHReply{ - MissingAccountActionPlans: map[string][]string{"1002": {"AP2"}}, // 1 - BrokenReferences: map[string][]string{"AP2": {"1001"}, "AP1": nil}, // 2 + MissingAccountActionPlans: map[string][]string{"1002": {"AP2"}}, + BrokenReferences: map[string][]string{"AP2": {"1001"}, "AP1": nil}, } - if rply, err := GetAccountActionPlanIndexHealth(dm, -1, -1, -1, -1, false, false); err != nil { + if rply, err := GetAccountActionPlansIndexHealth(dm, -1, -1, -1, -1, false, false); err != nil { t.Fatal(err) } else if !reflect.DeepEqual(exp, rply) { t.Errorf("Expecting: %+v, received: %+v", utils.ToJSON(exp), utils.ToJSON(rply)) @@ -72,11 +72,10 @@ func TestHealthAccountAction2(t *testing.T) { } exp := &AccountActionPlanIHReply{ - MissingActionPlans: []string{"AP1"}, MissingAccountActionPlans: map[string][]string{}, - BrokenReferences: map[string][]string{}, + BrokenReferences: map[string][]string{"AP1": nil}, } - if rply, err := GetAccountActionPlanIndexHealth(dm, -1, -1, -1, -1, false, false); err != nil { + if rply, err := GetAccountActionPlansIndexHealth(dm, -1, -1, -1, -1, false, false); err != nil { t.Fatal(err) } else if !reflect.DeepEqual(exp, rply) { t.Errorf("Expecting: %+v, received: %+v", utils.ToJSON(exp), utils.ToJSON(rply)) @@ -108,11 +107,10 @@ func TestHealthAccountAction3(t *testing.T) { } exp := &AccountActionPlanIHReply{ - MissingActionPlans: []string{}, - MissingAccountActionPlans: map[string][]string{"AP2": {"1002"}}, + MissingAccountActionPlans: map[string][]string{"1002": {"AP2"}}, BrokenReferences: map[string][]string{}, } - if rply, err := GetAccountActionPlanIndexHealth(dm, -1, -1, -1, -1, false, false); err != nil { + if rply, err := GetAccountActionPlansIndexHealth(dm, -1, -1, -1, -1, false, false); err != nil { t.Fatal(err) } else if !reflect.DeepEqual(exp, rply) { t.Errorf("Expecting: %+v, received: %+v", utils.ToJSON(exp), utils.ToJSON(rply)) @@ -147,11 +145,139 @@ func TestHealthAccountAction4(t *testing.T) { } exp := &AccountActionPlanIHReply{ - MissingActionPlans: []string{}, MissingAccountActionPlans: map[string][]string{}, BrokenReferences: map[string][]string{"AP2": {"1002"}}, } - if rply, err := GetAccountActionPlanIndexHealth(dm, -1, -1, -1, -1, false, false); err != nil { + if rply, err := GetAccountActionPlansIndexHealth(dm, -1, -1, -1, -1, false, false); err != nil { + t.Fatal(err) + } else if !reflect.DeepEqual(exp, rply) { + t.Errorf("Expecting: %+v, received: %+v", utils.ToJSON(exp), utils.ToJSON(rply)) + } +} + +func TestHealthReverseDestination(t *testing.T) { + Cache.Clear(nil) + cfg := config.NewDefaultCGRConfig() + db := NewInternalDB(nil, nil, true) + dm := NewDataManager(db, cfg.CacheCfg(), nil) + + if err := dm.SetReverseDestination("DST1", []string{"1001", "1002"}, utils.NonTransactional); err != nil { + t.Fatal(err) + } + if err := dm.SetReverseDestination("DST2", []string{"1001"}, utils.NonTransactional); err != nil { + t.Fatal(err) + } + if err := dm.SetDestination(&Destination{ + Id: "DST2", + Prefixes: []string{"1002"}, + }, utils.NonTransactional); err != nil { + t.Fatal(err) + } + + exp := &ReverseDestinationsIHReply{ + MissingReverseDestinations: map[string][]string{"1002": {"DST2"}}, + BrokenReferences: map[string][]string{"DST1": nil, "DST2": {"1001"}}, + } + if rply, err := GetReverseDestinationsIndexHealth(dm, -1, -1, -1, -1, false, false); err != nil { + t.Fatal(err) + } else if !reflect.DeepEqual(exp, rply) { + t.Errorf("Expecting: %+v, received: %+v", utils.ToJSON(exp), utils.ToJSON(rply)) + } +} + +func TestHealthReverseDestination2(t *testing.T) { + Cache.Clear(nil) + cfg := config.NewDefaultCGRConfig() + db := NewInternalDB(nil, nil, true) + dm := NewDataManager(db, cfg.CacheCfg(), nil) + + if err := dm.SetReverseDestination("DST1", []string{"1001"}, utils.NonTransactional); err != nil { + t.Fatal(err) + } + if err := dm.SetReverseDestination("DST2", []string{"1001"}, utils.NonTransactional); err != nil { + t.Fatal(err) + } + if err := dm.SetDestination(&Destination{ + Id: "DST2", + Prefixes: []string{"1001"}, + }, utils.NonTransactional); err != nil { + t.Fatal(err) + } + + exp := &ReverseDestinationsIHReply{ + MissingReverseDestinations: map[string][]string{}, + BrokenReferences: map[string][]string{"DST1": nil}, + } + if rply, err := GetReverseDestinationsIndexHealth(dm, -1, -1, -1, -1, false, false); err != nil { + t.Fatal(err) + } else if !reflect.DeepEqual(exp, rply) { + t.Errorf("Expecting: %+v, received: %+v", utils.ToJSON(exp), utils.ToJSON(rply)) + } +} + +func TestHealthReverseDestination3(t *testing.T) { + Cache.Clear(nil) + cfg := config.NewDefaultCGRConfig() + db := NewInternalDB(nil, nil, true) + dm := NewDataManager(db, cfg.CacheCfg(), nil) + + if err := dm.SetReverseDestination("DST1", []string{"1002"}, utils.NonTransactional); err != nil { + t.Fatal(err) + } + if err := dm.SetDestination(&Destination{ + Id: "DST1", + Prefixes: []string{"1002"}, + }, utils.NonTransactional); err != nil { + t.Fatal(err) + } + if err := dm.SetDestination(&Destination{ + Id: "DST2", + Prefixes: []string{"1002"}, + }, utils.NonTransactional); err != nil { + t.Fatal(err) + } + + exp := &ReverseDestinationsIHReply{ + MissingReverseDestinations: map[string][]string{"1002": {"DST2"}}, + BrokenReferences: map[string][]string{}, + } + if rply, err := GetReverseDestinationsIndexHealth(dm, -1, -1, -1, -1, false, false); err != nil { + t.Fatal(err) + } else if !reflect.DeepEqual(exp, rply) { + t.Errorf("Expecting: %+v, received: %+v", utils.ToJSON(exp), utils.ToJSON(rply)) + } +} + +func TestHealthReverseDestination4(t *testing.T) { + Cache.Clear(nil) + cfg := config.NewDefaultCGRConfig() + db := NewInternalDB(nil, nil, true) + dm := NewDataManager(db, cfg.CacheCfg(), nil) + + if err := dm.SetReverseDestination("DST1", []string{"1002"}, utils.NonTransactional); err != nil { + t.Fatal(err) + } + if err := dm.SetReverseDestination("DST2", []string{"1001", "1002"}, utils.NonTransactional); err != nil { + t.Fatal(err) + } + if err := dm.SetDestination(&Destination{ + Id: "DST1", + Prefixes: []string{"1002"}, + }, utils.NonTransactional); err != nil { + t.Fatal(err) + } + if err := dm.SetDestination(&Destination{ + Id: "DST2", + Prefixes: []string{"1001"}, + }, utils.NonTransactional); err != nil { + t.Fatal(err) + } + + exp := &ReverseDestinationsIHReply{ + MissingReverseDestinations: map[string][]string{}, + BrokenReferences: map[string][]string{"DST2": {"1002"}}, + } + if rply, err := GetReverseDestinationsIndexHealth(dm, -1, -1, -1, -1, false, false); err != nil { t.Fatal(err) } else if !reflect.DeepEqual(exp, rply) { t.Errorf("Expecting: %+v, received: %+v", utils.ToJSON(exp), utils.ToJSON(rply)) diff --git a/utils/consts.go b/utils/consts.go index ea82e3cb4..4daceac18 100644 --- a/utils/consts.go +++ b/utils/consts.go @@ -1271,174 +1271,175 @@ const ( // APIerSv1 APIs const ( - 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" + ApierV1 = "ApierV1" + ApierV2 = "ApierV2" + APIerSv1 = "APIerSv1" + APIerSv1ComputeFilterIndexes = "APIerSv1.ComputeFilterIndexes" + APIerSv1ComputeFilterIndexIDs = "APIerSv1.ComputeFilterIndexIDs" + APIerSv1GetAccountActionPlansIndexHealth = "APIerSv1.GetAccountActionPlansIndexHealth" + APIerSv1GetReverseDestinationsIndexHealth = "APIerSv1.GetReverseDestinationsIndexHealth" + 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