Files
grafana/pkg/tsdb/cloudwatch/metric_find_query_test.go
Nathan Vērzemnieks a18ea34688 CloudWatch: Backport aws-sdk-go-v2 update from external plugin (#107136)
* CloudWatch: Backport aws-sdk-go-v2 update from external plugin

* Review feedback & cleaning up a couple typos
2025-06-26 15:56:50 +02:00

286 lines
7.0 KiB
Go

package cloudwatch
import (
"context"
"encoding/json"
"net/url"
"testing"
"github.com/aws/aws-sdk-go-v2/aws"
ec2types "github.com/aws/aws-sdk-go-v2/service/ec2/types"
"github.com/aws/aws-sdk-go-v2/service/resourcegroupstaggingapi"
resourcegroupstaggingapitypes "github.com/aws/aws-sdk-go-v2/service/resourcegroupstaggingapi/types"
"github.com/grafana/grafana/pkg/tsdb/cloudwatch/models"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestQuery_InstanceAttributes(t *testing.T) {
origNewEC2API := NewEC2API
t.Cleanup(func() {
NewEC2API = origNewEC2API
})
var cli oldEC2Client
NewEC2API = func(aws.Config) models.EC2APIProvider {
return cli
}
t.Run("Get instance ID", func(t *testing.T) {
const instanceID = "i-12345678"
cli = oldEC2Client{
reservations: []ec2types.Reservation{
{
Instances: []ec2types.Instance{
{
InstanceId: aws.String(instanceID),
Tags: []ec2types.Tag{
{
Key: aws.String("Environment"),
Value: aws.String("production"),
},
},
},
},
},
},
}
filterMap := map[string][]string{
"tag:Environment": {"production"},
}
filterJson, err := json.Marshal(filterMap)
require.NoError(t, err)
ds := newTestDatasource()
resp, err := ds.handleGetEc2InstanceAttribute(
context.Background(),
url.Values{
"region": []string{"us-east-1"},
"attributeName": []string{"InstanceId"},
"filters": []string{string(filterJson)},
},
)
require.NoError(t, err)
expResponse := []suggestData{
{Text: instanceID, Value: instanceID, Label: instanceID},
}
assert.Equal(t, expResponse, resp)
})
t.Run("Get different types", func(t *testing.T) {
var expectedInt int32 = 3
var expectedBool = true
var expectedArn = "arn"
cli = oldEC2Client{
reservations: []ec2types.Reservation{
{
Instances: []ec2types.Instance{
{
AmiLaunchIndex: &expectedInt,
EbsOptimized: &expectedBool,
IamInstanceProfile: &ec2types.IamInstanceProfile{
Arn: &expectedArn,
},
},
},
},
},
}
ds := newTestDatasource()
testcases := []struct {
name string
attributeName string
expResponse []suggestData
}{
{
"int field",
"AmiLaunchIndex",
[]suggestData{
{Text: "3", Value: "3", Label: "3"},
},
},
{
"bool field",
"EbsOptimized",
[]suggestData{
{Text: "true", Value: "true", Label: "true"},
},
},
{
"nested field",
"IamInstanceProfile.Arn",
[]suggestData{
{Text: expectedArn, Value: expectedArn, Label: expectedArn},
},
},
{
"nil field",
"InstanceLifecycle",
[]suggestData{},
},
}
for _, tc := range testcases {
t.Run(tc.name, func(t *testing.T) {
filterMap := map[string][]string{}
filterJson, err := json.Marshal(filterMap)
require.NoError(t, err)
resp, err := ds.handleGetEc2InstanceAttribute(
context.Background(),
url.Values{
"region": []string{"us-east-1"},
"attributeName": []string{tc.attributeName},
"filters": []string{string(filterJson)},
},
)
require.NoError(t, err)
assert.Equal(t, tc.expResponse, resp)
})
}
})
}
func TestQuery_EBSVolumeIDs(t *testing.T) {
origNewEC2API := NewEC2API
t.Cleanup(func() {
NewEC2API = origNewEC2API
})
var cli oldEC2Client
NewEC2API = func(aws.Config) models.EC2APIProvider {
return cli
}
t.Run("", func(t *testing.T) {
cli = oldEC2Client{
reservations: []ec2types.Reservation{
{
Instances: []ec2types.Instance{
{
InstanceId: aws.String("i-1"),
BlockDeviceMappings: []ec2types.InstanceBlockDeviceMapping{
{Ebs: &ec2types.EbsInstanceBlockDevice{VolumeId: aws.String("vol-1-1")}},
{Ebs: &ec2types.EbsInstanceBlockDevice{VolumeId: aws.String("vol-1-2")}},
},
},
{
InstanceId: aws.String("i-2"),
BlockDeviceMappings: []ec2types.InstanceBlockDeviceMapping{
{Ebs: &ec2types.EbsInstanceBlockDevice{VolumeId: aws.String("vol-2-1")}},
{Ebs: &ec2types.EbsInstanceBlockDevice{VolumeId: aws.String("vol-2-2")}},
},
},
},
},
{
Instances: []ec2types.Instance{
{
InstanceId: aws.String("i-3"),
BlockDeviceMappings: []ec2types.InstanceBlockDeviceMapping{
{Ebs: &ec2types.EbsInstanceBlockDevice{VolumeId: aws.String("vol-3-1")}},
{Ebs: &ec2types.EbsInstanceBlockDevice{VolumeId: aws.String("vol-3-2")}},
},
},
{
InstanceId: aws.String("i-4"),
BlockDeviceMappings: []ec2types.InstanceBlockDeviceMapping{
{Ebs: &ec2types.EbsInstanceBlockDevice{VolumeId: aws.String("vol-4-1")}},
{Ebs: &ec2types.EbsInstanceBlockDevice{VolumeId: aws.String("vol-4-2")}},
},
},
},
},
},
}
ds := newTestDatasource()
resp, err := ds.handleGetEbsVolumeIds(
context.Background(),
url.Values{
"region": []string{"us-east-1"},
"instanceId": []string{"{i-1, i-2, i-3}"},
},
)
require.NoError(t, err)
expValues := []string{"vol-1-1", "vol-1-2", "vol-2-1", "vol-2-2", "vol-3-1", "vol-3-2"}
expResponse := []suggestData{}
for _, value := range expValues {
expResponse = append(expResponse, suggestData{Text: value, Value: value, Label: value})
}
assert.Equal(t, expResponse, resp)
})
}
func TestQuery_ResourceARNs(t *testing.T) {
origNewRGTAClient := NewRGTAClient
t.Cleanup(func() {
NewRGTAClient = origNewRGTAClient
})
var cli fakeRGTAClient
NewRGTAClient = func(aws.Config) resourcegroupstaggingapi.GetResourcesAPIClient {
return cli
}
t.Run("", func(t *testing.T) {
cli = fakeRGTAClient{
tagMapping: []resourcegroupstaggingapitypes.ResourceTagMapping{
{
ResourceARN: aws.String("arn:aws:ec2:us-east-1:123456789012:instance/i-12345678901234567"),
Tags: []resourcegroupstaggingapitypes.Tag{
{
Key: aws.String("Environment"),
Value: aws.String("production"),
},
},
},
{
ResourceARN: aws.String("arn:aws:ec2:us-east-1:123456789012:instance/i-76543210987654321"),
Tags: []resourcegroupstaggingapitypes.Tag{
{
Key: aws.String("Environment"),
Value: aws.String("production"),
},
},
},
},
}
tagMap := map[string][]string{
"Environment": {"production"},
}
tagJson, err := json.Marshal(tagMap)
require.NoError(t, err)
ds := newTestDatasource()
resp, err := ds.handleGetResourceArns(
context.Background(),
url.Values{
"region": []string{"us-east-1"},
"resourceType": []string{"ec2:instance"},
"tags": []string{string(tagJson)},
},
)
require.NoError(t, err)
expValues := []string{
"arn:aws:ec2:us-east-1:123456789012:instance/i-12345678901234567",
"arn:aws:ec2:us-east-1:123456789012:instance/i-76543210987654321",
}
expResponse := []suggestData{}
for _, value := range expValues {
expResponse = append(expResponse, suggestData{Text: value, Value: value, Label: value})
}
assert.Equal(t, expResponse, resp)
})
}