diff --git a/pkg/api/frontendsettings.go b/pkg/api/frontendsettings.go index ea05fdfdbaa..005ea871534 100644 --- a/pkg/api/frontendsettings.go +++ b/pkg/api/frontendsettings.go @@ -4,7 +4,6 @@ import ( "context" "fmt" "net/http" - "strconv" "github.com/grafana/grafana/pkg/plugins" "github.com/grafana/grafana/pkg/services/accesscontrol" @@ -268,7 +267,7 @@ func (hs *HTTPServer) getFSDataSources(c *contextmodel.ReqContext, enabledPlugin url := ds.Url if ds.Access == datasources.DS_ACCESS_PROXY { - url = "/api/datasources/proxy/" + strconv.FormatInt(ds.Id, 10) + url = "/api/datasources/proxy/uid/" + ds.Uid } dsDTO := plugins.DataSourceDTO{ diff --git a/pkg/services/query/query.go b/pkg/services/query/query.go index 9befc139afb..a83d6d32745 100644 --- a/pkg/services/query/query.go +++ b/pkg/services/query/query.go @@ -322,18 +322,18 @@ func (s *Service) getDataSourceFromQuery(ctx context.Context, user *user.SignedI return grafanads.DataSourceModel(user.OrgID), nil } - // use datasourceId if it exists - id := query.Get("datasourceId").MustInt64(0) - if id > 0 { - ds, err = s.dataSourceCache.GetDatasource(ctx, id, user, skipCache) + if uid != "" { + ds, err = s.dataSourceCache.GetDatasourceByUID(ctx, uid, user, skipCache) if err != nil { return nil, err } return ds, nil } - if uid != "" { - ds, err = s.dataSourceCache.GetDatasourceByUID(ctx, uid, user, skipCache) + // use datasourceId if it exists + id := query.Get("datasourceId").MustInt64(0) + if id > 0 { + ds, err = s.dataSourceCache.GetDatasource(ctx, id, user, skipCache) if err != nil { return nil, err } diff --git a/pkg/services/query/query_test.go b/pkg/services/query/query_test.go index b17f1c3b472..428e02e6296 100644 --- a/pkg/services/query/query_test.go +++ b/pkg/services/query/query_test.go @@ -4,6 +4,7 @@ import ( "bytes" "context" "errors" + "fmt" "net/http" "testing" @@ -380,6 +381,33 @@ func TestQueryDataMultipleSources(t *testing.T) { // Responses aren't mocked, so a "healthy" query will just return an empty response require.NotContains(t, res.Responses, "A") }) + + t.Run("ignores a deprecated datasourceID", func(t *testing.T) { + tc := setup(t) + query1, err := simplejson.NewJson([]byte(` + { + "datasource": { + "type": "mysql", + "uid": "ds1" + }, + "datasourceId": 1, + "refId": "A" + } + `)) + require.NoError(t, err) + queries := []*simplejson.Json{query1} + reqDTO := dtos.MetricRequest{ + From: "2022-01-01", + To: "2022-01-02", + Queries: queries, + Debug: false, + PublicDashboardAccessToken: "abc123", + } + + _, err = tc.queryService.QueryData(context.Background(), tc.signedInUser, true, reqDTO) + + require.NoError(t, err) + }) } func setup(t *testing.T) *testContext { @@ -449,7 +477,8 @@ type fakeDataSourceCache struct { } func (c *fakeDataSourceCache) GetDatasource(ctx context.Context, datasourceID int64, user *user.SignedInUser, skipCache bool) (*datasources.DataSource, error) { - return c.ds, nil + // deprecated: fake an error to ensure we are using GetDatasourceByUID + return nil, fmt.Errorf("not found") } func (c *fakeDataSourceCache) GetDatasourceByUID(ctx context.Context, datasourceUID string, user *user.SignedInUser, skipCache bool) (*datasources.DataSource, error) {