GoogleCloudMonitoring: use typed struct in newInstanceSettings (#58440)

This commit is contained in:
Andres Martinez Gotor
2022-11-09 09:38:06 +01:00
committed by GitHub
parent 6ed35292fe
commit 9778d642df
2 changed files with 43 additions and 23 deletions

View File

@ -154,6 +154,13 @@ type datasourceInfo struct {
decryptedSecureJSONData map[string]string decryptedSecureJSONData map[string]string
} }
type datasourceJSONData struct {
AuthenticationType string `json:"authenticationType"`
DefaultProject string `json:"defaultProject"`
ClientEmail string `json:"clientEmail"`
TokenURI string `json:"tokenUri"`
}
type datasourceService struct { type datasourceService struct {
url string url string
client *http.Client client *http.Client
@ -161,40 +168,24 @@ type datasourceService struct {
func newInstanceSettings(httpClientProvider httpclient.Provider) datasource.InstanceFactoryFunc { func newInstanceSettings(httpClientProvider httpclient.Provider) datasource.InstanceFactoryFunc {
return func(settings backend.DataSourceInstanceSettings) (instancemgmt.Instance, error) { return func(settings backend.DataSourceInstanceSettings) (instancemgmt.Instance, error) {
var jsonData map[string]interface{} var jsonData datasourceJSONData
err := json.Unmarshal(settings.JSONData, &jsonData) err := json.Unmarshal(settings.JSONData, &jsonData)
if err != nil { if err != nil {
return nil, fmt.Errorf("error reading settings: %w", err) return nil, fmt.Errorf("error reading settings: %w", err)
} }
authType := jwtAuthentication if jsonData.AuthenticationType == "" {
if authTypeOverride, ok := jsonData["authenticationType"].(string); ok && authTypeOverride != "" { jsonData.AuthenticationType = jwtAuthentication
authType = authTypeOverride
}
var defaultProject string
if jsonData["defaultProject"] != nil {
defaultProject = jsonData["defaultProject"].(string)
}
var clientEmail string
if jsonData["clientEmail"] != nil {
clientEmail = jsonData["clientEmail"].(string)
}
var tokenUri string
if jsonData["tokenUri"] != nil {
tokenUri = jsonData["tokenUri"].(string)
} }
dsInfo := &datasourceInfo{ dsInfo := &datasourceInfo{
id: settings.ID, id: settings.ID,
updated: settings.Updated, updated: settings.Updated,
url: settings.URL, url: settings.URL,
authenticationType: authType, authenticationType: jsonData.AuthenticationType,
defaultProject: defaultProject, defaultProject: jsonData.DefaultProject,
clientEmail: clientEmail, clientEmail: jsonData.ClientEmail,
tokenUri: tokenUri, tokenUri: jsonData.TokenURI,
decryptedSecureJSONData: settings.DecryptedSecureJSONData, decryptedSecureJSONData: settings.DecryptedSecureJSONData,
services: map[string]datasourceService{}, services: map[string]datasourceService{},
} }

View File

@ -13,11 +13,40 @@ import (
"github.com/grafana/grafana-plugin-sdk-go/backend" "github.com/grafana/grafana-plugin-sdk-go/backend"
"github.com/grafana/grafana-plugin-sdk-go/backend/datasource" "github.com/grafana/grafana-plugin-sdk-go/backend/datasource"
"github.com/grafana/grafana-plugin-sdk-go/backend/instancemgmt" "github.com/grafana/grafana-plugin-sdk-go/backend/instancemgmt"
"github.com/grafana/grafana/pkg/infra/httpclient"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
) )
func TestNewInstanceSettings(t *testing.T) {
t.Run("should create a new instance with empty settings", func(t *testing.T) {
cli := httpclient.NewProvider()
f := newInstanceSettings(cli)
dsInfo, err := f(backend.DataSourceInstanceSettings{
JSONData: json.RawMessage(`{}`),
})
require.NoError(t, err)
assert.NotNil(t, dsInfo)
assert.Equal(t, jwtAuthentication, dsInfo.(*datasourceInfo).authenticationType)
})
t.Run("should create a new instance parsing settings", func(t *testing.T) {
cli := httpclient.NewProvider()
f := newInstanceSettings(cli)
dsInfo, err := f(backend.DataSourceInstanceSettings{
JSONData: json.RawMessage(`{"authenticationType": "test", "defaultProject": "test", "clientEmail": "test", "tokenUri": "test"}`),
})
require.NoError(t, err)
assert.NotNil(t, dsInfo)
dsInfoCasted := dsInfo.(*datasourceInfo)
assert.Equal(t, "test", dsInfoCasted.authenticationType)
assert.Equal(t, "test", dsInfoCasted.defaultProject)
assert.Equal(t, "test", dsInfoCasted.clientEmail)
assert.Equal(t, "test", dsInfoCasted.tokenUri)
})
}
func TestCloudMonitoring(t *testing.T) { func TestCloudMonitoring(t *testing.T) {
service := &Service{} service := &Service{}