From 9778d642dfa9df1a46f47d103e429be062ec2c4a Mon Sep 17 00:00:00 2001 From: Andres Martinez Gotor Date: Wed, 9 Nov 2022 09:38:06 +0100 Subject: [PATCH] GoogleCloudMonitoring: use typed struct in newInstanceSettings (#58440) --- pkg/tsdb/cloudmonitoring/cloudmonitoring.go | 37 +++++++------------ .../cloudmonitoring/cloudmonitoring_test.go | 29 +++++++++++++++ 2 files changed, 43 insertions(+), 23 deletions(-) diff --git a/pkg/tsdb/cloudmonitoring/cloudmonitoring.go b/pkg/tsdb/cloudmonitoring/cloudmonitoring.go index fd3fa813e75..511b461ca23 100644 --- a/pkg/tsdb/cloudmonitoring/cloudmonitoring.go +++ b/pkg/tsdb/cloudmonitoring/cloudmonitoring.go @@ -154,6 +154,13 @@ type datasourceInfo struct { 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 { url string client *http.Client @@ -161,40 +168,24 @@ type datasourceService struct { func newInstanceSettings(httpClientProvider httpclient.Provider) datasource.InstanceFactoryFunc { return func(settings backend.DataSourceInstanceSettings) (instancemgmt.Instance, error) { - var jsonData map[string]interface{} + var jsonData datasourceJSONData err := json.Unmarshal(settings.JSONData, &jsonData) if err != nil { return nil, fmt.Errorf("error reading settings: %w", err) } - authType := jwtAuthentication - if authTypeOverride, ok := jsonData["authenticationType"].(string); ok && authTypeOverride != "" { - 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) + if jsonData.AuthenticationType == "" { + jsonData.AuthenticationType = jwtAuthentication } dsInfo := &datasourceInfo{ id: settings.ID, updated: settings.Updated, url: settings.URL, - authenticationType: authType, - defaultProject: defaultProject, - clientEmail: clientEmail, - tokenUri: tokenUri, + authenticationType: jsonData.AuthenticationType, + defaultProject: jsonData.DefaultProject, + clientEmail: jsonData.ClientEmail, + tokenUri: jsonData.TokenURI, decryptedSecureJSONData: settings.DecryptedSecureJSONData, services: map[string]datasourceService{}, } diff --git a/pkg/tsdb/cloudmonitoring/cloudmonitoring_test.go b/pkg/tsdb/cloudmonitoring/cloudmonitoring_test.go index e20a9b9cc35..01351f445a2 100644 --- a/pkg/tsdb/cloudmonitoring/cloudmonitoring_test.go +++ b/pkg/tsdb/cloudmonitoring/cloudmonitoring_test.go @@ -13,11 +13,40 @@ import ( "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/instancemgmt" + "github.com/grafana/grafana/pkg/infra/httpclient" "github.com/stretchr/testify/assert" "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) { service := &Service{}