diff --git a/pkg/tsdb/cloudmonitoring/cloudmonitoring.go b/pkg/tsdb/cloudmonitoring/cloudmonitoring.go index 7c8fae24d31..e319c035e2d 100644 --- a/pkg/tsdb/cloudmonitoring/cloudmonitoring.go +++ b/pkg/tsdb/cloudmonitoring/cloudmonitoring.go @@ -72,6 +72,8 @@ func ProvideService(httpClientProvider httpclient.Provider, tracer tracing.Trace tracer: tracer, httpClientProvider: httpClientProvider, im: datasource.NewInstanceManager(newInstanceSettings(httpClientProvider)), + + gceDefaultProjectGetter: utils.GCEDefaultProject, } s.resourceHandler = httpadapter.New(s.newResourceMux()) @@ -91,7 +93,10 @@ func (s *Service) CheckHealth(ctx context.Context, req *backend.CheckHealthReque defaultProject, err := s.getDefaultProject(ctx, *dsInfo) if err != nil { - return nil, err + return &backend.CheckHealthResult{ + Status: backend.HealthStatusError, + Message: err.Error(), + }, nil } url := fmt.Sprintf("%v/v3/projects/%v/metricDescriptors", dsInfo.services[cloudMonitor].url, defaultProject) @@ -128,6 +133,9 @@ type Service struct { tracer tracing.Tracer resourceHandler backend.CallResourceHandler + + // mocked in tests + gceDefaultProjectGetter func(ctx context.Context) (string, error) } type QueryModel struct { @@ -612,7 +620,7 @@ func (s *Service) createRequest(ctx context.Context, dsInfo *datasourceInfo, pro func (s *Service) getDefaultProject(ctx context.Context, dsInfo datasourceInfo) (string, error) { if dsInfo.authenticationType == gceAuthentication { - return utils.GCEDefaultProject(ctx) + return s.gceDefaultProjectGetter(ctx) } return dsInfo.defaultProject, nil } diff --git a/pkg/tsdb/cloudmonitoring/cloudmonitoring_test.go b/pkg/tsdb/cloudmonitoring/cloudmonitoring_test.go index a2623eda107..728611c541e 100644 --- a/pkg/tsdb/cloudmonitoring/cloudmonitoring_test.go +++ b/pkg/tsdb/cloudmonitoring/cloudmonitoring_test.go @@ -1,7 +1,9 @@ package cloudmonitoring import ( + "context" "encoding/json" + "fmt" "net/url" "reflect" "strings" @@ -9,6 +11,8 @@ import ( "time" "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/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -933,3 +937,29 @@ func baseReq() *backend.QueryDataRequest { } return query } + +func TestCheckHealth(t *testing.T) { + t.Run("and using GCE authentation should return proper error", func(t *testing.T) { + im := datasource.NewInstanceManager(func(s backend.DataSourceInstanceSettings) (instancemgmt.Instance, error) { + return &datasourceInfo{ + authenticationType: gceAuthentication, + }, nil + }) + service := &Service{ + im: im, + gceDefaultProjectGetter: func(ctx context.Context) (string, error) { + return "", fmt.Errorf("not found!") + }, + } + res, err := service.CheckHealth(context.Background(), &backend.CheckHealthRequest{ + PluginContext: backend.PluginContext{ + DataSourceInstanceSettings: &backend.DataSourceInstanceSettings{}, + }, + }) + assert.Nil(t, err) + assert.Equal(t, &backend.CheckHealthResult{ + Status: backend.HealthStatusError, + Message: "not found!", + }, res) + }) +}