Cloudwatch: Refactor datasource instance factory method (#57452)

* wip

* fix broken test
This commit is contained in:
Erik Sundell
2022-10-25 09:52:12 +02:00
committed by GitHub
parent d9a6c3f398
commit 8adbacb18e
10 changed files with 218 additions and 158 deletions
+36
View File
@@ -0,0 +1,36 @@
package models
import (
"encoding/json"
"fmt"
"github.com/grafana/grafana-aws-sdk/pkg/awsds"
"github.com/grafana/grafana-plugin-sdk-go/backend"
)
type CloudWatchSettings struct {
awsds.AWSDatasourceSettings
Namespace string `json:"customMetricsNamespaces"`
}
func LoadCloudWatchSettings(config backend.DataSourceInstanceSettings) (*CloudWatchSettings, error) {
instance := &CloudWatchSettings{}
if config.JSONData != nil && len(config.JSONData) > 1 {
if err := json.Unmarshal(config.JSONData, instance); err != nil {
return nil, fmt.Errorf("could not unmarshal DatasourceSettings json: %w", err)
}
}
if instance.Region == "default" || instance.Region == "" {
instance.Region = instance.DefaultRegion
}
if instance.Profile == "" {
instance.Profile = config.Database
}
instance.AccessKey = config.DecryptedSecureJSONData["accessKey"]
instance.SecretKey = config.DecryptedSecureJSONData["secretKey"]
return instance, nil
}
@@ -0,0 +1,74 @@
package models
import (
"testing"
"github.com/grafana/grafana-aws-sdk/pkg/awsds"
"github.com/grafana/grafana-plugin-sdk-go/backend"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func Test_Settings_LoadCloudWatchSettings(t *testing.T) {
t.Run("Should parse keys query type", func(t *testing.T) {
settings := backend.DataSourceInstanceSettings{
ID: 33,
JSONData: []byte(`{
"authType": "keys",
"assumeRoleArn": "arn:aws:iam::123456789012:role/grafana",
"customMetricsNamespaces": "AWS/EC2,AWS/ELB",
"defaultRegion": "us-east-1",
"externalId": "123456789012",
"profile": "default",
"endpoint": "https://monitoring.us-east-1.amazonaws.com"
}`),
DecryptedSecureJSONData: map[string]string{
"accessKey": "AKIAIOSFODNN7EXAMPLE",
"secretKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
},
}
s, err := LoadCloudWatchSettings(settings)
require.NoError(t, err)
assert.Equal(t, awsds.AuthTypeKeys, s.AuthType)
assert.Equal(t, "arn:aws:iam::123456789012:role/grafana", s.AssumeRoleARN)
assert.Equal(t, "AWS/EC2,AWS/ELB", s.Namespace)
assert.Equal(t, "us-east-1", s.Region)
assert.Equal(t, "123456789012", s.ExternalID)
assert.Equal(t, "default", s.Profile)
assert.Equal(t, "https://monitoring.us-east-1.amazonaws.com", s.Endpoint)
assert.Equal(t, "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY", s.SecretKey)
assert.Equal(t, "AKIAIOSFODNN7EXAMPLE", s.AccessKey)
})
t.Run("Should handle legacy auth type arn as default", func(t *testing.T) {
settings := backend.DataSourceInstanceSettings{
ID: 33,
JSONData: []byte(`{
"authType": "arn",
"assumeRoleArn": "arn:aws:iam::123456789012:role/grafana",
"customMetricsNamespaces": "AWS/EC2,AWS/ELB",
"defaultRegion": "us-east-1",
"externalId": "123456789012",
"profile": "default",
"endpoint": "https://monitoring.us-east-1.amazonaws.com"
}`),
DecryptedSecureJSONData: map[string]string{
"accessKey": "AKIAIOSFODNN7EXAMPLE",
"secretKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
},
}
s, err := LoadCloudWatchSettings(settings)
require.NoError(t, err)
assert.Equal(t, awsds.AuthTypeDefault, s.AuthType)
assert.Equal(t, "arn:aws:iam::123456789012:role/grafana", s.AssumeRoleARN)
assert.Equal(t, "AWS/EC2,AWS/ELB", s.Namespace)
assert.Equal(t, "us-east-1", s.Region)
assert.Equal(t, "123456789012", s.ExternalID)
assert.Equal(t, "default", s.Profile)
assert.Equal(t, "https://monitoring.us-east-1.amazonaws.com", s.Endpoint)
assert.Equal(t, "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY", s.SecretKey)
assert.Equal(t, "AKIAIOSFODNN7EXAMPLE", s.AccessKey)
})
}