From 1f7c84f1256ed46fe5099f27aae57a2121da1080 Mon Sep 17 00:00:00 2001 From: Lion Ralfs Date: Tue, 1 Nov 2022 08:50:04 +0100 Subject: [PATCH] CloudWatch: Fix `all-log-groups` endpoint when called without logGroupNamePrefix (#57483) --- pkg/tsdb/cloudwatch/cloudwatch_test.go | 67 ++++++++++++++++++++++++ pkg/tsdb/cloudwatch/metric_find_query.go | 14 +++-- 2 files changed, 76 insertions(+), 5 deletions(-) diff --git a/pkg/tsdb/cloudwatch/cloudwatch_test.go b/pkg/tsdb/cloudwatch/cloudwatch_test.go index 8db4144d865..c4ec23dc1dd 100644 --- a/pkg/tsdb/cloudwatch/cloudwatch_test.go +++ b/pkg/tsdb/cloudwatch/cloudwatch_test.go @@ -330,6 +330,73 @@ func TestQuery_ResourceRequest_DescribeAllLogGroups(t *testing.T) { "group_a", "group_b", "group_c", "group_x", "group_y", "group_z", }), suggestDataResponse) }) + + t.Run("Should call api with LogGroupNamePrefix if passed in resource call", func(t *testing.T) { + cli = fakeCWLogsClient{ + logGroups: []cloudwatchlogs.DescribeLogGroupsOutput{ + {LogGroups: []*cloudwatchlogs.LogGroup{}}, + }, + } + + executor := newExecutor(im, newTestConfig(), &fakeSessionCache{}, featuremgmt.WithFeatures()) + + req := &backend.CallResourceRequest{ + Method: "GET", + Path: "/all-log-groups?logGroupNamePrefix=test", + PluginContext: backend.PluginContext{ + DataSourceInstanceSettings: &backend.DataSourceInstanceSettings{ + ID: 0, + }, + PluginID: "cloudwatch", + }, + } + err := executor.CallResource(context.Background(), req, sender) + + require.NoError(t, err) + sent := sender.Response + require.NotNil(t, sent) + require.Equal(t, http.StatusOK, sent.Status) + + assert.Equal(t, []*cloudwatchlogs.DescribeLogGroupsInput{ + { + Limit: aws.Int64(defaultLogGroupLimit), + LogGroupNamePrefix: aws.String("test"), + }, + }, cli.calls.describeLogGroups) + }) + + t.Run("Should call api without LogGroupNamePrefix when an empty string is passed in resource call", func(t *testing.T) { + cli = fakeCWLogsClient{ + logGroups: []cloudwatchlogs.DescribeLogGroupsOutput{ + {LogGroups: []*cloudwatchlogs.LogGroup{}}, + }, + } + + executor := newExecutor(im, newTestConfig(), &fakeSessionCache{}, featuremgmt.WithFeatures()) + + req := &backend.CallResourceRequest{ + Method: "GET", + Path: "/all-log-groups?logGroupNamePrefix=", + PluginContext: backend.PluginContext{ + DataSourceInstanceSettings: &backend.DataSourceInstanceSettings{ + ID: 0, + }, + PluginID: "cloudwatch", + }, + } + err := executor.CallResource(context.Background(), req, sender) + + require.NoError(t, err) + sent := sender.Response + require.NotNil(t, sent) + require.Equal(t, http.StatusOK, sent.Status) + + assert.Equal(t, []*cloudwatchlogs.DescribeLogGroupsInput{ + { + Limit: aws.Int64(50), + }, + }, cli.calls.describeLogGroups) + }) } func TestQuery_ResourceRequest_DescribeLogGroups(t *testing.T) { diff --git a/pkg/tsdb/cloudwatch/metric_find_query.go b/pkg/tsdb/cloudwatch/metric_find_query.go index 4231fec6e74..707a2b51fbd 100644 --- a/pkg/tsdb/cloudwatch/metric_find_query.go +++ b/pkg/tsdb/cloudwatch/metric_find_query.go @@ -339,11 +339,15 @@ func (e *cloudWatchExecutor) handleGetAllLogGroups(pluginCtx backend.PluginConte var response *cloudwatchlogs.DescribeLogGroupsOutput result := make([]suggestData, 0) for { - response, err = logsClient.DescribeLogGroups(&cloudwatchlogs.DescribeLogGroupsInput{ - LogGroupNamePrefix: aws.String(logGroupNamePrefix), - NextToken: nextToken, - Limit: aws.Int64(defaultLogGroupLimit), - }) + input := &cloudwatchlogs.DescribeLogGroupsInput{ + Limit: aws.Int64(defaultLogGroupLimit), + NextToken: nextToken, + } + if len(logGroupNamePrefix) > 0 { + input.LogGroupNamePrefix = aws.String(logGroupNamePrefix) + } + response, err = logsClient.DescribeLogGroups(input) + if err != nil || response == nil { return nil, err }