From 06a9e1b6614820ee37dc54b92d0a0a51a3a2ea77 Mon Sep 17 00:00:00 2001 From: gezimbll Date: Thu, 3 Oct 2024 15:58:22 +0200 Subject: [PATCH] changed DataManager.GetTrendProfiles to GetTrendProfileIDs with new signature --- apier/v1/trends.go | 32 ---------- apier/v1/trends_it_test.go | 117 ++++++++++--------------------------- engine/datamanager.go | 37 +++++------- engine/libtrends.go | 5 -- utils/consts.go | 1 - 5 files changed, 48 insertions(+), 144 deletions(-) diff --git a/apier/v1/trends.go b/apier/v1/trends.go index cee7095ca..b415d3cf9 100644 --- a/apier/v1/trends.go +++ b/apier/v1/trends.go @@ -41,38 +41,6 @@ func (apierSv1 *APIerSv1) GetTrendProfile(ctx *context.Context, arg *utils.Tenan return } -// GetTrendProfiles returns a list of Trendprofiles -func (apierSv1 *APIerSv1) GetTrendProfiles(ctx *context.Context, arg *engine.TrendProfilesAPI, reply *[]*engine.TrendProfile) (err error) { - tr, err := apierSv1.DataManager.GetTrendProfiles(arg.Tenant, arg.TpIDs) - if err != nil { - return utils.APIErrorHandler(err) - } - *reply = tr - return -} - -// GetTrendProfileIDs returns list of trendProfile IDs registered for a tenant -func (apierSv1 *APIerSv1) GetTrendProfileIDs(ctx *context.Context, args *utils.PaginatorWithTenant, trPrfIDs *[]string) (err error) { - tnt := args.Tenant - if tnt == utils.EmptyString { - tnt = apierSv1.Config.GeneralCfg().DefaultTenant - } - prfx := utils.TrendsProfilePrefix + tnt + utils.ConcatenatedKeySep - keys, err := apierSv1.DataManager.DataDB().GetKeysForPrefix(prfx) - if err != nil { - return err - } - if len(keys) == 0 { - return utils.ErrNotFound - } - trIDs := make([]string, len(keys)) - for i, key := range keys { - trIDs[i] = key[len(prfx):] - } - *trPrfIDs = args.PaginateStringSlice(trIDs) - return -} - // SetTrendProfile alters/creates a TrendProfile func (apierSv1 *APIerSv1) SetTrendProfile(ctx *context.Context, arg *engine.TrendProfileWithAPIOpts, reply *string) error { if missing := utils.MissingStructFields(arg.TrendProfile, []string{utils.ID}); len(missing) != 0 { diff --git a/apier/v1/trends_it_test.go b/apier/v1/trends_it_test.go index 5e8951838..098aea595 100644 --- a/apier/v1/trends_it_test.go +++ b/apier/v1/trends_it_test.go @@ -38,7 +38,7 @@ var ( trendCfgPath string trendCfg *config.CGRConfig trendRPC *birpc.Client - trendProfile2 *engine.TrendProfileWithAPIOpts + trendProfile *engine.TrendProfileWithAPIOpts trendConfigDIR string sTestsTrend = []func(t *testing.T){ @@ -49,8 +49,6 @@ var ( testTrendSRPCConn, testTrendSFromFolder, testTrendSetTrendProfile, - testTrendSGetTrendProfileIDs, - testTrendSGetTrendProfiles, testTrendSUpdateTrendProfile, testTrendSRemTrendProfile, testTrendSKillEngine, @@ -126,114 +124,63 @@ func testTrendSetTrendProfile(t *testing.T) { reply *engine.TrendProfileWithAPIOpts result string ) - trendProfile2 = &engine.TrendProfileWithAPIOpts{ + trendProfile = &engine.TrendProfileWithAPIOpts{ TrendProfile: &engine.TrendProfile{ - Tenant: "cgrates.org", - ID: "Trend1", - ThresholdIDs: []string{"THD1"}}, + Tenant: "cgrates.org", + ID: "Trend1", + ThresholdIDs: []string{"THD1"}, + CorrelationType: utils.MetaAverage, + MinItems: 1, + QueueLength: 10, + StatID: "Stats1", + Schedule: "@every 4s", + }, } if err := trendRPC.Call(context.Background(), utils.APIerSv1GetTrendProfile, &utils.TenantID{Tenant: "cgrates.org", ID: "Trend1"}, &reply); err == nil || err.Error() != utils.ErrNotFound.Error() { t.Fatal(err) } - if err := trendRPC.Call(context.Background(), utils.APIerSv1SetTrendProfile, trendProfile2, &result); err != nil { + if err := trendRPC.Call(context.Background(), utils.APIerSv1SetTrendProfile, trendProfile, &result); err != nil { t.Error(err) } else if result != utils.OK { t.Errorf("Expected: %v,Received: %v", utils.OK, result) } if err := trendRPC.Call(context.Background(), utils.APIerSv1GetTrendProfile, &utils.TenantID{Tenant: "cgrates.org", ID: "Trend1"}, &reply); err != nil { t.Error(err) - } else if diff := cmp.Diff(trendProfile2, reply, cmpopts.SortSlices(func(a, b string) bool { return a < b })); diff != utils.EmptyString { + } else if diff := cmp.Diff(trendProfile, reply, cmpopts.SortSlices(func(a, b string) bool { return a < b })); diff != utils.EmptyString { t.Errorf("Unnexpected profile (-expected +got):\n%s", diff) } } -func testTrendSGetTrendProfileIDs(t *testing.T) { - expected := []string{"Trend1", "TR_1"} - var result []string - if err := trendRPC.Call(context.Background(), utils.APIerSv1GetTrendProfileIDs, utils.PaginatorWithTenant{}, &result); err != nil { - t.Error(err) - } else if len(expected) != len(result) { - t.Errorf("Expecting : %+v, received: %+v", expected, result) - } -} - -func testTrendSGetTrendProfiles(t *testing.T) { - trendPrf := &engine.TrendProfileWithAPIOpts{ - TrendProfile: &engine.TrendProfile{ - Tenant: "tenant1", - ID: "Trend_Last", - StatID: "Stat1", - Schedule: "*now", - }} - var result string - if err := trendRPC.Call(context.Background(), utils.APIerSv1SetTrendProfile, trendPrf, &result); err != nil { - t.Error(err) - } else if result != utils.OK { - t.Errorf("Expected: %v,Received: %v", utils.OK, result) - } - tpTr := &engine.TrendProfile{ - Tenant: "cgrates.org", - ID: "TR_1", - StatID: "Stats1", - Schedule: "0 1 * * *", - Metrics: []string{"*acc"}, - QueueLength: -1, - MinItems: 1, - CorrelationType: "*last", - Tolerance: 5, - Stored: false, - ThresholdIDs: []string{"TD1"}, - } - expRes := []*engine.TrendProfile{ - trendPrf.TrendProfile, - tpTr, - trendProfile2.TrendProfile, - } - var tResult []*engine.TrendProfile - - //get all trend profiles from every tenant when no tenant is specified - if err := trendRPC.Call(context.Background(), utils.APIerSv1GetTrendProfiles, engine.TrendProfilesAPI{}, &tResult); err != nil { - t.Error(err) - } else if diff := cmp.Diff(expRes, tResult, cmpopts.SortSlices(func(a, b *engine.TrendProfile) bool { return a.ID < b.ID })); diff != utils.EmptyString { - t.Errorf("Unnexpected profiles (-expected +got):\n%s", diff) - } - - expRes = []*engine.TrendProfile{ - tpTr, - trendProfile2.TrendProfile, - } - - //get all trend profiles of a tenant when ids length is 0 - if err := trendRPC.Call(context.Background(), utils.APIerSv1GetTrendProfiles, engine.TrendProfilesAPI{Tenant: "cgrates.org"}, &tResult); err != nil { - t.Error(err) - } else if diff := cmp.Diff(expRes, tResult, cmpopts.SortSlices(func(a, b *engine.TrendProfile) bool { return a.ID < b.ID })); diff != utils.EmptyString { - t.Errorf("Unnexpected profiles (-expected +got):\n%s", diff) - } - - expRes = []*engine.TrendProfile{ - trendProfile2.TrendProfile, - } - - //get trend profiles by their ids for a tenant - if err := trendRPC.Call(context.Background(), utils.APIerSv1GetTrendProfiles, engine.TrendProfilesAPI{Tenant: "cgrates.org", TpIDs: []string{"Trend1"}}, &tResult); err != nil { - t.Error(err) - } else if diff := cmp.Diff(expRes, tResult, cmpopts.SortSlices(func(a, b *engine.TrendProfile) bool { return a.ID < b.ID })); diff != utils.EmptyString { - t.Errorf("Unnexpected profiles (-expected +got):\n%s", diff) - } -} func testTrendSUpdateTrendProfile(t *testing.T) { + trendProfile.MinItems = 4 + trendProfile.QueueLength = 100 + trendProfile.CorrelationType = utils.MetaLast + trendProfile.Schedule = "@every 1s" + trendProfile.StatID = "Stats2" var ( reply *engine.TrendProfileWithAPIOpts result string ) - if err := trendRPC.Call(context.Background(), utils.APIerSv1SetTrendProfile, trendProfile2, &result); err != nil { + expTrn := &engine.TrendProfileWithAPIOpts{ + TrendProfile: &engine.TrendProfile{ + Tenant: "cgrates.org", + ID: "Trend1", + ThresholdIDs: []string{"THD1"}, + CorrelationType: utils.MetaLast, + MinItems: 4, + QueueLength: 100, + StatID: "Stats2", + Schedule: "@every 1s", + }, + } + if err := trendRPC.Call(context.Background(), utils.APIerSv1SetTrendProfile, trendProfile, &result); err != nil { t.Error(err) } if err := trendRPC.Call(context.Background(), utils.APIerSv1GetTrendProfile, &utils.TenantID{Tenant: "cgrates.org", ID: "Trend1"}, &reply); err != nil { t.Error(err) - } else if diff := cmp.Diff(trendProfile2, reply, cmpopts.SortSlices(func(a, b string) bool { return a < b })); diff != utils.EmptyString { + } else if diff := cmp.Diff(expTrn, reply, cmpopts.SortSlices(func(a, b string) bool { return a < b })); diff != utils.EmptyString { t.Errorf("Unnexpected profile (-expected +got):\n%s", diff) } } diff --git a/engine/datamanager.go b/engine/datamanager.go index 9cdef9e7e..65cf28a32 100644 --- a/engine/datamanager.go +++ b/engine/datamanager.go @@ -1428,14 +1428,10 @@ func (dm *DataManager) GetTrendProfile(tenant, id string, cacheRead, cacheWrite return } -func (dm *DataManager) GetTrendProfiles(tenant string, tpIDs []string) (tps []*TrendProfile, err error) { +func (dm *DataManager) GetTrendProfileIDs(tenants []string) (tps map[string][]string, err error) { prfx := utils.TrendsProfilePrefix - if tenant != utils.EmptyString { - prfx += tenant + utils.ConcatenatedKeySep - } - var tp *TrendProfile - if tenant == utils.EmptyString || len(tpIDs) == 0 { - var keys []string + var keys []string + if len(tenants) == 0 { keys, err = dm.dataDB.GetKeysForPrefix(prfx) if err != nil { return @@ -1443,29 +1439,28 @@ func (dm *DataManager) GetTrendProfiles(tenant string, tpIDs []string) (tps []*T if len(keys) == 0 { return nil, utils.ErrNotFound } + tps = make(map[string][]string) for _, key := range keys { indx := strings.Index(key, utils.ConcatenatedKeySep) - if len(prfx) == len(utils.TrendsProfilePrefix) { - tenant = key[len(utils.TrendsProfilePrefix):indx] - } + tenant := key[len(utils.TrendsProfilePrefix):indx] id := key[indx+1:] - tp, err = dm.GetTrendProfile(tenant, id, true, false, utils.NonTransactional) - if err != nil { - return - } - tps = append(tps, tp) + tps[tenant] = append(tps[tenant], id) } return } - for _, tpID := range tpIDs { - tp, err = dm.GetTrendProfile(tenant, tpID, true, false, utils.NonTransactional) - if err == utils.ErrNotFound { - continue - } + for _, tenant := range tenants { + tntPrfx := prfx + tenant + utils.ConcatenatedKeySep + keys, err = dm.dataDB.GetKeysForPrefix(tntPrfx) if err != nil { return } - tps = append(tps, tp) + if len(keys) == 0 { + return nil, utils.ErrNotFound + } + tps = make(map[string][]string) + for _, key := range keys { + tps[tenant] = append(tps[tenant], key[len(tntPrfx):]) + } } return } diff --git a/engine/libtrends.go b/engine/libtrends.go index 60c71ea1b..d0735f350 100644 --- a/engine/libtrends.go +++ b/engine/libtrends.go @@ -76,11 +76,6 @@ type TrendProfileWithAPIOpts struct { APIOpts map[string]any } -type TrendProfilesAPI struct { - Tenant string - TpIDs []string -} - func (srp *TrendProfile) TenantID() string { return utils.ConcatenatedKey(srp.Tenant, srp.ID) } diff --git a/utils/consts.go b/utils/consts.go index 148b5af46..6737b0a06 100644 --- a/utils/consts.go +++ b/utils/consts.go @@ -1701,7 +1701,6 @@ const ( APIerSv1RemoveTrendProfile = "APIerSv1.RemoveTrendProfile" APIerSv1GetTrendProfile = "APIerSv1.GetTrendProfile" APIerSv1GetTrendProfileIDs = "APIerSv1.GetTrendProfileIDs" - APIerSv1GetTrendProfiles = "APIerSv1.GetTrendProfiles" TrendSv1Ping = "TrendSv1.Ping" TrendSv1ScheduleQueries = "TrendSv1.ScheduleQueries" TrendSv1GetTrend = "TrendSv1.GetTrend"