diff --git a/pkg/tsdb/cloudwatch/annotation_query_test.go b/pkg/tsdb/cloudwatch/annotation_query_test.go index 4463975bf59..369039f52b5 100644 --- a/pkg/tsdb/cloudwatch/annotation_query_test.go +++ b/pkg/tsdb/cloudwatch/annotation_query_test.go @@ -33,7 +33,7 @@ func TestQuery_AnnotationQuery(t *testing.T) { return datasourceInfo{}, nil }) - executor := newExecutor(im, newTestConfig(), fakeSessionCache{}) + executor := newExecutor(im, newTestConfig(), &fakeSessionCache{}) _, err := executor.QueryData(context.Background(), &backend.QueryDataRequest{ PluginContext: backend.PluginContext{ DataSourceInstanceSettings: &backend.DataSourceInstanceSettings{}, @@ -67,7 +67,7 @@ func TestQuery_AnnotationQuery(t *testing.T) { return datasourceInfo{}, nil }) - executor := newExecutor(im, newTestConfig(), fakeSessionCache{}) + executor := newExecutor(im, newTestConfig(), &fakeSessionCache{}) _, err := executor.QueryData(context.Background(), &backend.QueryDataRequest{ PluginContext: backend.PluginContext{ DataSourceInstanceSettings: &backend.DataSourceInstanceSettings{}, diff --git a/pkg/tsdb/cloudwatch/cloudwatch_test.go b/pkg/tsdb/cloudwatch/cloudwatch_test.go index b0d6a187da3..c5fba3a4859 100644 --- a/pkg/tsdb/cloudwatch/cloudwatch_test.go +++ b/pkg/tsdb/cloudwatch/cloudwatch_test.go @@ -2,8 +2,10 @@ package cloudwatch import ( "context" + "encoding/json" "fmt" "testing" + "time" "github.com/aws/aws-sdk-go/aws" awsrequest "github.com/aws/aws-sdk-go/aws/request" @@ -106,7 +108,7 @@ func Test_CheckHealth(t *testing.T) { im := datasource.NewInstanceManager(func(s backend.DataSourceInstanceSettings) (instancemgmt.Instance, error) { return datasourceInfo{}, nil }) - executor := newExecutor(im, newTestConfig(), fakeSessionCache{}) + executor := newExecutor(im, newTestConfig(), &fakeSessionCache{}) resp, err := executor.CheckHealth(context.Background(), &backend.CheckHealthRequest{ PluginContext: backend.PluginContext{DataSourceInstanceSettings: &backend.DataSourceInstanceSettings{}}, @@ -128,7 +130,7 @@ func Test_CheckHealth(t *testing.T) { im := datasource.NewInstanceManager(func(s backend.DataSourceInstanceSettings) (instancemgmt.Instance, error) { return datasourceInfo{}, nil }) - executor := newExecutor(im, newTestConfig(), fakeSessionCache{}) + executor := newExecutor(im, newTestConfig(), &fakeSessionCache{}) resp, err := executor.CheckHealth(context.Background(), &backend.CheckHealthRequest{ PluginContext: backend.PluginContext{DataSourceInstanceSettings: &backend.DataSourceInstanceSettings{}}, @@ -149,7 +151,7 @@ func Test_CheckHealth(t *testing.T) { im := datasource.NewInstanceManager(func(s backend.DataSourceInstanceSettings) (instancemgmt.Instance, error) { return datasourceInfo{}, nil }) - executor := newExecutor(im, newTestConfig(), fakeSessionCache{}) + executor := newExecutor(im, newTestConfig(), &fakeSessionCache{}) resp, err := executor.CheckHealth(context.Background(), &backend.CheckHealthRequest{ PluginContext: backend.PluginContext{DataSourceInstanceSettings: &backend.DataSourceInstanceSettings{}}, @@ -167,7 +169,7 @@ func Test_CheckHealth(t *testing.T) { im := datasource.NewInstanceManager(func(s backend.DataSourceInstanceSettings) (instancemgmt.Instance, error) { return datasourceInfo{}, nil }) - executor := newExecutor(im, newTestConfig(), fakeSessionCache{getSession: func(c awsds.SessionConfig) (*session.Session, error) { + executor := newExecutor(im, newTestConfig(), &fakeSessionCache{getSession: func(c awsds.SessionConfig) (*session.Session, error) { return nil, fmt.Errorf("some sessions error") }}) @@ -182,3 +184,66 @@ func Test_CheckHealth(t *testing.T) { }, resp) }) } +func Test_executeLogAlertQuery(t *testing.T) { + origNewCWClient := NewCWClient + t.Cleanup(func() { + NewCWClient = origNewCWClient + }) + + var cli fakeCWLogsClient + NewCWLogsClient = func(sess *session.Session) cloudwatchlogsiface.CloudWatchLogsAPI { + return &cli + } + + t.Run("getCWLogsClient is called with region from input JSON", func(t *testing.T) { + cli = fakeCWLogsClient{queryResults: cloudwatchlogs.GetQueryResultsOutput{Status: aws.String("Complete")}} + im := datasource.NewInstanceManager(func(s backend.DataSourceInstanceSettings) (instancemgmt.Instance, error) { + return datasourceInfo{}, nil + }) + sess := fakeSessionCache{} + executor := newExecutor(im, newTestConfig(), &sess) + + _, err := executor.QueryData(context.Background(), &backend.QueryDataRequest{ + Headers: map[string]string{"FromAlert": "some value"}, + PluginContext: backend.PluginContext{DataSourceInstanceSettings: &backend.DataSourceInstanceSettings{}}, + Queries: []backend.DataQuery{ + { + TimeRange: backend.TimeRange{From: time.Unix(0, 0), To: time.Unix(1, 0)}, + JSON: json.RawMessage(`{ + "queryMode": "Logs", + "region": "some region" + }`), + }, + }, + }) + + assert.NoError(t, err) + assert.Equal(t, []string{"some region"}, sess.calledRegions) + }) + + t.Run("getCWLogsClient is called with region from instance manager when region is default", func(t *testing.T) { + cli = fakeCWLogsClient{queryResults: cloudwatchlogs.GetQueryResultsOutput{Status: aws.String("Complete")}} + im := datasource.NewInstanceManager(func(s backend.DataSourceInstanceSettings) (instancemgmt.Instance, error) { + return datasourceInfo{region: "instance manager's region"}, nil + }) + sess := fakeSessionCache{} + + executor := newExecutor(im, newTestConfig(), &sess) + _, err := executor.QueryData(context.Background(), &backend.QueryDataRequest{ + Headers: map[string]string{"FromAlert": "some value"}, + PluginContext: backend.PluginContext{DataSourceInstanceSettings: &backend.DataSourceInstanceSettings{}}, + Queries: []backend.DataQuery{ + { + TimeRange: backend.TimeRange{From: time.Unix(0, 0), To: time.Unix(1, 0)}, + JSON: json.RawMessage(`{ + "queryMode": "Logs", + "region": "default" + }`), + }, + }, + }) + + assert.NoError(t, err) + assert.Equal(t, []string{"instance manager's region"}, sess.calledRegions) + }) +} diff --git a/pkg/tsdb/cloudwatch/log_actions_test.go b/pkg/tsdb/cloudwatch/log_actions_test.go index 8a641c1b9b7..d84866054ad 100644 --- a/pkg/tsdb/cloudwatch/log_actions_test.go +++ b/pkg/tsdb/cloudwatch/log_actions_test.go @@ -52,7 +52,7 @@ func TestQuery_DescribeLogGroups(t *testing.T) { return datasourceInfo{}, nil }) - executor := newExecutor(im, newTestConfig(), fakeSessionCache{}) + executor := newExecutor(im, newTestConfig(), &fakeSessionCache{}) resp, err := executor.QueryData(context.Background(), &backend.QueryDataRequest{ PluginContext: backend.PluginContext{ DataSourceInstanceSettings: &backend.DataSourceInstanceSettings{}, @@ -108,7 +108,7 @@ func TestQuery_DescribeLogGroups(t *testing.T) { return datasourceInfo{}, nil }) - executor := newExecutor(im, newTestConfig(), fakeSessionCache{}) + executor := newExecutor(im, newTestConfig(), &fakeSessionCache{}) resp, err := executor.QueryData(context.Background(), &backend.QueryDataRequest{ PluginContext: backend.PluginContext{ DataSourceInstanceSettings: &backend.DataSourceInstanceSettings{}, @@ -183,7 +183,7 @@ func TestQuery_GetLogGroupFields(t *testing.T) { return datasourceInfo{}, nil }) - executor := newExecutor(im, newTestConfig(), fakeSessionCache{}) + executor := newExecutor(im, newTestConfig(), &fakeSessionCache{}) resp, err := executor.QueryData(context.Background(), &backend.QueryDataRequest{ PluginContext: backend.PluginContext{ DataSourceInstanceSettings: &backend.DataSourceInstanceSettings{}, @@ -264,7 +264,7 @@ func TestQuery_StartQuery(t *testing.T) { return datasourceInfo{}, nil }) - executor := newExecutor(im, newTestConfig(), fakeSessionCache{}) + executor := newExecutor(im, newTestConfig(), &fakeSessionCache{}) _, err := executor.QueryData(context.Background(), &backend.QueryDataRequest{ PluginContext: backend.PluginContext{ DataSourceInstanceSettings: &backend.DataSourceInstanceSettings{}, @@ -317,7 +317,7 @@ func TestQuery_StartQuery(t *testing.T) { return datasourceInfo{}, nil }) - executor := newExecutor(im, newTestConfig(), fakeSessionCache{}) + executor := newExecutor(im, newTestConfig(), &fakeSessionCache{}) resp, err := executor.QueryData(context.Background(), &backend.QueryDataRequest{ PluginContext: backend.PluginContext{ DataSourceInstanceSettings: &backend.DataSourceInstanceSettings{}, @@ -374,7 +374,7 @@ func Test_executeStartQuery(t *testing.T) { im := datasource.NewInstanceManager(func(s backend.DataSourceInstanceSettings) (instancemgmt.Instance, error) { return datasourceInfo{}, nil }) - executor := newExecutor(im, newTestConfig(), fakeSessionCache{}) + executor := newExecutor(im, newTestConfig(), &fakeSessionCache{}) _, err := executor.QueryData(context.Background(), &backend.QueryDataRequest{ PluginContext: backend.PluginContext{DataSourceInstanceSettings: &backend.DataSourceInstanceSettings{}}, @@ -410,7 +410,7 @@ func Test_executeStartQuery(t *testing.T) { im := datasource.NewInstanceManager(func(s backend.DataSourceInstanceSettings) (instancemgmt.Instance, error) { return datasourceInfo{}, nil }) - executor := newExecutor(im, newTestConfig(), fakeSessionCache{}) + executor := newExecutor(im, newTestConfig(), &fakeSessionCache{}) _, err := executor.QueryData(context.Background(), &backend.QueryDataRequest{ PluginContext: backend.PluginContext{DataSourceInstanceSettings: &backend.DataSourceInstanceSettings{}}, @@ -437,7 +437,7 @@ func Test_executeStartQuery(t *testing.T) { im := datasource.NewInstanceManager(func(s backend.DataSourceInstanceSettings) (instancemgmt.Instance, error) { return datasourceInfo{}, nil }) - executor := newExecutor(im, newTestConfig(), fakeSessionCache{}) + executor := newExecutor(im, newTestConfig(), &fakeSessionCache{}) _, err := executor.QueryData(context.Background(), &backend.QueryDataRequest{ PluginContext: backend.PluginContext{DataSourceInstanceSettings: &backend.DataSourceInstanceSettings{}}, @@ -499,7 +499,7 @@ func TestQuery_StopQuery(t *testing.T) { To: time.Unix(1584700643, 0), } - executor := newExecutor(im, newTestConfig(), fakeSessionCache{}) + executor := newExecutor(im, newTestConfig(), &fakeSessionCache{}) resp, err := executor.QueryData(context.Background(), &backend.QueryDataRequest{ PluginContext: backend.PluginContext{ DataSourceInstanceSettings: &backend.DataSourceInstanceSettings{}, @@ -589,7 +589,7 @@ func TestQuery_GetQueryResults(t *testing.T) { return datasourceInfo{}, nil }) - executor := newExecutor(im, newTestConfig(), fakeSessionCache{}) + executor := newExecutor(im, newTestConfig(), &fakeSessionCache{}) resp, err := executor.QueryData(context.Background(), &backend.QueryDataRequest{ PluginContext: backend.PluginContext{ DataSourceInstanceSettings: &backend.DataSourceInstanceSettings{}, diff --git a/pkg/tsdb/cloudwatch/metric_data_query_builder_test.go b/pkg/tsdb/cloudwatch/metric_data_query_builder_test.go index cf4b0439129..de91d588270 100644 --- a/pkg/tsdb/cloudwatch/metric_data_query_builder_test.go +++ b/pkg/tsdb/cloudwatch/metric_data_query_builder_test.go @@ -10,7 +10,7 @@ import ( func TestMetricDataQueryBuilder(t *testing.T) { t.Run("buildMetricDataQuery", func(t *testing.T) { t.Run("should use metric stat", func(t *testing.T) { - executor := newExecutor(nil, newTestConfig(), fakeSessionCache{}) + executor := newExecutor(nil, newTestConfig(), &fakeSessionCache{}) query := getBaseQuery() query.MetricEditorMode = MetricEditorModeBuilder query.MetricQueryType = MetricQueryTypeSearch @@ -22,7 +22,7 @@ func TestMetricDataQueryBuilder(t *testing.T) { }) t.Run("should use custom built expression", func(t *testing.T) { - executor := newExecutor(nil, newTestConfig(), fakeSessionCache{}) + executor := newExecutor(nil, newTestConfig(), &fakeSessionCache{}) query := getBaseQuery() query.MetricEditorMode = MetricEditorModeBuilder query.MetricQueryType = MetricQueryTypeSearch @@ -34,7 +34,7 @@ func TestMetricDataQueryBuilder(t *testing.T) { }) t.Run("should use sql expression", func(t *testing.T) { - executor := newExecutor(nil, newTestConfig(), fakeSessionCache{}) + executor := newExecutor(nil, newTestConfig(), &fakeSessionCache{}) query := getBaseQuery() query.MetricEditorMode = MetricEditorModeRaw query.MetricQueryType = MetricQueryTypeQuery @@ -46,7 +46,7 @@ func TestMetricDataQueryBuilder(t *testing.T) { }) t.Run("should use user defined math expression", func(t *testing.T) { - executor := newExecutor(nil, newTestConfig(), fakeSessionCache{}) + executor := newExecutor(nil, newTestConfig(), &fakeSessionCache{}) query := getBaseQuery() query.MetricEditorMode = MetricEditorModeRaw query.MetricQueryType = MetricQueryTypeSearch @@ -58,7 +58,7 @@ func TestMetricDataQueryBuilder(t *testing.T) { }) t.Run("should set period in user defined expression", func(t *testing.T) { - executor := newExecutor(nil, newTestConfig(), fakeSessionCache{}) + executor := newExecutor(nil, newTestConfig(), &fakeSessionCache{}) query := getBaseQuery() query.MetricEditorMode = MetricEditorModeRaw query.MetricQueryType = MetricQueryTypeSearch diff --git a/pkg/tsdb/cloudwatch/metric_find_query_test.go b/pkg/tsdb/cloudwatch/metric_find_query_test.go index 33b64cc1972..223a0869c8d 100644 --- a/pkg/tsdb/cloudwatch/metric_find_query_test.go +++ b/pkg/tsdb/cloudwatch/metric_find_query_test.go @@ -53,7 +53,7 @@ func TestQuery_Metrics(t *testing.T) { return datasourceInfo{}, nil }) - executor := newExecutor(im, newTestConfig(), fakeSessionCache{}) + executor := newExecutor(im, newTestConfig(), &fakeSessionCache{}) resp, err := executor.handleGetMetrics( backend.PluginContext{ DataSourceInstanceSettings: &backend.DataSourceInstanceSettings{}, @@ -88,7 +88,7 @@ func TestQuery_Metrics(t *testing.T) { return datasourceInfo{}, nil }) - executor := newExecutor(im, newTestConfig(), fakeSessionCache{}) + executor := newExecutor(im, newTestConfig(), &fakeSessionCache{}) resp, err := executor.handleGetDimensionKeys( backend.PluginContext{ DataSourceInstanceSettings: &backend.DataSourceInstanceSettings{}, @@ -128,7 +128,7 @@ func TestQuery_Regions(t *testing.T) { return datasourceInfo{}, nil }) - executor := newExecutor(im, newTestConfig(), fakeSessionCache{}) + executor := newExecutor(im, newTestConfig(), &fakeSessionCache{}) resp, err := executor.handleGetRegions( backend.PluginContext{ DataSourceInstanceSettings: &backend.DataSourceInstanceSettings{}, @@ -201,7 +201,7 @@ func TestQuery_InstanceAttributes(t *testing.T) { filterJson, err := json.Marshal(filterMap) require.NoError(t, err) - executor := newExecutor(im, newTestConfig(), fakeSessionCache{}) + executor := newExecutor(im, newTestConfig(), &fakeSessionCache{}) resp, err := executor.handleGetEc2InstanceAttribute( backend.PluginContext{ DataSourceInstanceSettings: &backend.DataSourceInstanceSettings{}, @@ -278,7 +278,7 @@ func TestQuery_EBSVolumeIDs(t *testing.T) { return datasourceInfo{}, nil }) - executor := newExecutor(im, newTestConfig(), fakeSessionCache{}) + executor := newExecutor(im, newTestConfig(), &fakeSessionCache{}) resp, err := executor.handleGetEbsVolumeIds( backend.PluginContext{ DataSourceInstanceSettings: &backend.DataSourceInstanceSettings{}, @@ -344,7 +344,7 @@ func TestQuery_ResourceARNs(t *testing.T) { tagJson, err := json.Marshal(tagMap) require.NoError(t, err) - executor := newExecutor(im, newTestConfig(), fakeSessionCache{}) + executor := newExecutor(im, newTestConfig(), &fakeSessionCache{}) resp, err := executor.handleGetResourceArns( backend.PluginContext{ DataSourceInstanceSettings: &backend.DataSourceInstanceSettings{}, @@ -374,7 +374,7 @@ func TestQuery_GetAllMetrics(t *testing.T) { return datasourceInfo{}, nil }) - executor := newExecutor(im, newTestConfig(), fakeSessionCache{}) + executor := newExecutor(im, newTestConfig(), &fakeSessionCache{}) resp, err := executor.handleGetAllMetrics( backend.PluginContext{ DataSourceInstanceSettings: &backend.DataSourceInstanceSettings{}, @@ -423,7 +423,7 @@ func TestQuery_GetDimensionKeys(t *testing.T) { return datasourceInfo{}, nil }) - executor := newExecutor(im, newTestConfig(), fakeSessionCache{}) + executor := newExecutor(im, newTestConfig(), &fakeSessionCache{}) resp, err := executor.handleGetDimensionKeys( backend.PluginContext{ DataSourceInstanceSettings: &backend.DataSourceInstanceSettings{}, @@ -453,7 +453,7 @@ func TestQuery_GetDimensionKeys(t *testing.T) { return datasourceInfo{}, nil }) - executor := newExecutor(im, newTestConfig(), fakeSessionCache{}) + executor := newExecutor(im, newTestConfig(), &fakeSessionCache{}) resp, err := executor.handleGetDimensionKeys( backend.PluginContext{ DataSourceInstanceSettings: &backend.DataSourceInstanceSettings{}, @@ -548,7 +548,7 @@ func TestQuery_ListMetricsPagination(t *testing.T) { im := datasource.NewInstanceManager(func(s backend.DataSourceInstanceSettings) (instancemgmt.Instance, error) { return datasourceInfo{}, nil }) - executor := newExecutor(im, &setting.Cfg{AWSListMetricsPageLimit: 3, AWSAllowedAuthProviders: []string{"default"}, AWSAssumeRoleEnabled: true}, fakeSessionCache{}) + executor := newExecutor(im, &setting.Cfg{AWSListMetricsPageLimit: 3, AWSAllowedAuthProviders: []string{"default"}, AWSAssumeRoleEnabled: true}, &fakeSessionCache{}) response, err := executor.listMetrics(backend.PluginContext{ DataSourceInstanceSettings: &backend.DataSourceInstanceSettings{}, }, "default", &cloudwatch.ListMetricsInput{}) @@ -563,7 +563,7 @@ func TestQuery_ListMetricsPagination(t *testing.T) { im := datasource.NewInstanceManager(func(s backend.DataSourceInstanceSettings) (instancemgmt.Instance, error) { return datasourceInfo{}, nil }) - executor := newExecutor(im, &setting.Cfg{AWSListMetricsPageLimit: 1000, AWSAllowedAuthProviders: []string{"default"}, AWSAssumeRoleEnabled: true}, fakeSessionCache{}) + executor := newExecutor(im, &setting.Cfg{AWSListMetricsPageLimit: 1000, AWSAllowedAuthProviders: []string{"default"}, AWSAssumeRoleEnabled: true}, &fakeSessionCache{}) response, err := executor.listMetrics(backend.PluginContext{ DataSourceInstanceSettings: &backend.DataSourceInstanceSettings{}, }, "default", &cloudwatch.ListMetricsInput{}) diff --git a/pkg/tsdb/cloudwatch/time_series_query_test.go b/pkg/tsdb/cloudwatch/time_series_query_test.go index c9aeddb8872..7c55c4d2459 100644 --- a/pkg/tsdb/cloudwatch/time_series_query_test.go +++ b/pkg/tsdb/cloudwatch/time_series_query_test.go @@ -19,7 +19,7 @@ import ( ) func TestTimeSeriesQuery(t *testing.T) { - executor := newExecutor(nil, newTestConfig(), fakeSessionCache{}) + executor := newExecutor(nil, newTestConfig(), &fakeSessionCache{}) now := time.Now() origNewCWClient := NewCWClient @@ -54,7 +54,7 @@ func TestTimeSeriesQuery(t *testing.T) { return datasourceInfo{}, nil }) - executor := newExecutor(im, newTestConfig(), fakeSessionCache{}) + executor := newExecutor(im, newTestConfig(), &fakeSessionCache{}) resp, err := executor.QueryData(context.Background(), &backend.QueryDataRequest{ PluginContext: backend.PluginContext{ DataSourceInstanceSettings: &backend.DataSourceInstanceSettings{}, diff --git a/pkg/tsdb/cloudwatch/utils_test.go b/pkg/tsdb/cloudwatch/utils_test.go index 2d872915374..e6bf1156535 100644 --- a/pkg/tsdb/cloudwatch/utils_test.go +++ b/pkg/tsdb/cloudwatch/utils_test.go @@ -217,10 +217,13 @@ func newTestConfig() *setting.Cfg { } type fakeSessionCache struct { - getSession func(c awsds.SessionConfig) (*session.Session, error) + getSession func(c awsds.SessionConfig) (*session.Session, error) + calledRegions []string } -func (s fakeSessionCache) GetSession(c awsds.SessionConfig) (*session.Session, error) { +func (s *fakeSessionCache) GetSession(c awsds.SessionConfig) (*session.Session, error) { + s.calledRegions = append(s.calledRegions, c.Settings.Region) + if s.getSession != nil { return s.getSession(c) }