Skip to content

Commit eb258df

Browse files
authored
Fix "missing datasource" error (#51)
1 parent ab727a8 commit eb258df

File tree

3 files changed

+26
-29
lines changed

3 files changed

+26
-29
lines changed

datasource.go

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,12 @@ var (
2222
MissingDBConnection = errors.New("unable to get default db connection")
2323
)
2424

25-
func defaultKey(datasourceID int64) string {
26-
return fmt.Sprintf("%d-%s", datasourceID, defaultKeySuffix)
25+
func defaultKey(datasourceUID string) string {
26+
return fmt.Sprintf("%s-%s", datasourceUID, defaultKeySuffix)
2727
}
2828

29-
func keyWithConnectionArgs(datasourceID int64, connArgs json.RawMessage) string {
30-
return fmt.Sprintf("%d-%s", datasourceID, string(connArgs))
29+
func keyWithConnectionArgs(datasourceUID string, connArgs json.RawMessage) string {
30+
return fmt.Sprintf("%s-%s", datasourceUID, string(connArgs))
3131
}
3232

3333
type dbConnection struct {
@@ -69,7 +69,7 @@ func (ds *sqldatasource) NewDatasource(settings backend.DataSourceInstanceSettin
6969
if err != nil {
7070
return nil, err
7171
}
72-
key := defaultKey(settings.ID)
72+
key := defaultKey(settings.UID)
7373
ds.storeDBConnection(key, dbConnection{db, settings})
7474

7575
mux := http.NewServeMux()
@@ -115,7 +115,7 @@ func (ds *sqldatasource) QueryData(ctx context.Context, req *backend.QueryDataRe
115115
// Execute each query and store the results by query RefID
116116
for _, q := range req.Queries {
117117
go func(query backend.DataQuery) {
118-
frames, err := ds.handleQuery(ctx, query)
118+
frames, err := ds.handleQuery(ctx, query, req.PluginContext.DataSourceInstanceSettings.UID)
119119

120120
response.Set(query.RefID, backend.DataResponse{
121121
Frames: frames,
@@ -131,13 +131,13 @@ func (ds *sqldatasource) QueryData(ctx context.Context, req *backend.QueryDataRe
131131

132132
}
133133

134-
func (ds *sqldatasource) getDBConnectionFromQuery(q *Query) (string, dbConnection, error) {
134+
func (ds *sqldatasource) getDBConnectionFromQuery(q *Query, datasourceUID string) (string, dbConnection, error) {
135135
if !ds.EnableMultipleConnections && len(q.ConnectionArgs) > 0 {
136136
return "", dbConnection{}, MissingMultipleConnectionsConfig
137137
}
138138
// The database connection may vary depending on query arguments
139139
// The raw arguments are used as key to store the db connection in memory so they can be reused
140-
key := defaultKey(q.DatasourceID)
140+
key := defaultKey(datasourceUID)
141141
dbConn, ok := ds.getDBConnection(key)
142142
if !ok {
143143
return "", dbConnection{}, MissingDBConnection
@@ -146,7 +146,7 @@ func (ds *sqldatasource) getDBConnectionFromQuery(q *Query) (string, dbConnectio
146146
return key, dbConn, nil
147147
}
148148

149-
key = keyWithConnectionArgs(q.DatasourceID, q.ConnectionArgs)
149+
key = keyWithConnectionArgs(datasourceUID, q.ConnectionArgs)
150150
if cachedConn, ok := ds.getDBConnection(key); ok {
151151
return key, cachedConn, nil
152152
}
@@ -164,7 +164,7 @@ func (ds *sqldatasource) getDBConnectionFromQuery(q *Query) (string, dbConnectio
164164
}
165165

166166
// handleQuery will call query, and attempt to reconnect if the query failed
167-
func (ds *sqldatasource) handleQuery(ctx context.Context, req backend.DataQuery) (data.Frames, error) {
167+
func (ds *sqldatasource) handleQuery(ctx context.Context, req backend.DataQuery, datasourceUID string) (data.Frames, error) {
168168
// Convert the backend.DataQuery into a Query object
169169
q, err := GetQuery(req)
170170
if err != nil {
@@ -184,7 +184,7 @@ func (ds *sqldatasource) handleQuery(ctx context.Context, req backend.DataQuery)
184184
}
185185

186186
// Retrieve the database connection
187-
cacheKey, dbConn, err := ds.getDBConnectionFromQuery(q)
187+
cacheKey, dbConn, err := ds.getDBConnectionFromQuery(q, datasourceUID)
188188
if err != nil {
189189
return getErrorFrameFromQuery(q), err
190190
}
@@ -224,7 +224,7 @@ func (ds *sqldatasource) handleQuery(ctx context.Context, req backend.DataQuery)
224224

225225
// CheckHealth pings the connected SQL database
226226
func (ds *sqldatasource) CheckHealth(ctx context.Context, req *backend.CheckHealthRequest) (*backend.CheckHealthResult, error) {
227-
key := defaultKey(req.PluginContext.DataSourceInstanceSettings.ID)
227+
key := defaultKey(req.PluginContext.DataSourceInstanceSettings.UID)
228228
dbConn, ok := ds.getDBConnection(key)
229229
if !ok {
230230
return nil, MissingDBConnection

datasource_test.go

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -27,48 +27,48 @@ func Test_getDBConnectionFromQuery(t *testing.T) {
2727
d := &fakeDriver{db: db3}
2828
tests := []struct {
2929
desc string
30-
dsID int64
30+
dsUID string
3131
args string
3232
existingDB *sql.DB
3333
expectedKey string
3434
expectedDB *sql.DB
3535
}{
3636
{
3737
desc: "it should return the default db with no args",
38-
dsID: 1,
38+
dsUID: "uid1",
3939
args: "",
40-
expectedKey: "1-default",
40+
expectedKey: "uid1-default",
4141
expectedDB: db,
4242
},
4343
{
4444
desc: "it should return the cached connection for the given args",
45-
dsID: 1,
45+
dsUID: "uid1",
4646
args: "foo",
47-
expectedKey: "1-foo",
47+
expectedKey: "uid1-foo",
4848
existingDB: db2,
4949
expectedDB: db2,
5050
},
5151
{
5252
desc: "it should create a new connection with the given args",
53-
dsID: 1,
53+
dsUID: "uid1",
5454
args: "foo",
55-
expectedKey: "1-foo",
55+
expectedKey: "uid1-foo",
5656
expectedDB: db3,
5757
},
5858
}
5959
for _, tt := range tests {
6060
t.Run(tt.desc, func(t *testing.T) {
6161
ds := &sqldatasource{c: d, EnableMultipleConnections: true}
62-
settings := backend.DataSourceInstanceSettings{ID: tt.dsID}
63-
key := defaultKey(tt.dsID)
62+
settings := backend.DataSourceInstanceSettings{UID: tt.dsUID}
63+
key := defaultKey(tt.dsUID)
6464
// Add the mandatory default db
6565
ds.storeDBConnection(key, dbConnection{db, settings})
6666
if tt.existingDB != nil {
67-
key = keyWithConnectionArgs(tt.dsID, []byte(tt.args))
67+
key = keyWithConnectionArgs(tt.dsUID, []byte(tt.args))
6868
ds.storeDBConnection(key, dbConnection{tt.existingDB, settings})
6969
}
7070

71-
key, dbConn, err := ds.getDBConnectionFromQuery(&Query{DatasourceID: tt.dsID, ConnectionArgs: json.RawMessage(tt.args)})
71+
key, dbConn, err := ds.getDBConnectionFromQuery(&Query{ConnectionArgs: json.RawMessage(tt.args)}, tt.dsUID)
7272
if err != nil {
7373
t.Fatalf("unexpected error %v", err)
7474
}
@@ -83,15 +83,15 @@ func Test_getDBConnectionFromQuery(t *testing.T) {
8383

8484
t.Run("it should return an error if connection args are used without enabling multiple connections", func(t *testing.T) {
8585
ds := &sqldatasource{c: d, EnableMultipleConnections: false}
86-
_, _, err := ds.getDBConnectionFromQuery(&Query{ConnectionArgs: json.RawMessage("foo")})
86+
_, _, err := ds.getDBConnectionFromQuery(&Query{ConnectionArgs: json.RawMessage("foo")}, "dsUID")
8787
if err == nil || !errors.Is(err, MissingMultipleConnectionsConfig) {
8888
t.Errorf("expecting error: %v", MissingMultipleConnectionsConfig)
8989
}
9090
})
9191

9292
t.Run("it should return an error if the default connection is missing", func(t *testing.T) {
9393
ds := &sqldatasource{c: d}
94-
_, _, err := ds.getDBConnectionFromQuery(&Query{})
94+
_, _, err := ds.getDBConnectionFromQuery(&Query{}, "dsUID")
9595
if err == nil || !errors.Is(err, MissingDBConnection) {
9696
t.Errorf("expecting error: %v", MissingDBConnection)
9797
}
@@ -110,7 +110,7 @@ func Test_Dispose(t *testing.T) {
110110
}
111111

112112
ds := &sqldatasource{}
113-
ds.dbConnections.Store(defaultKey(1), dbConnection{db: db1})
113+
ds.dbConnections.Store(defaultKey("uid1"), dbConnection{db: db1})
114114
ds.dbConnections.Store("foo", dbConnection{db: db2})
115115

116116
mock1.ExpectClose()

query.go

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ type Query struct {
3737
Interval time.Duration `json:"-"`
3838
TimeRange backend.TimeRange `json:"-"`
3939
MaxDataPoints int64 `json:"-"`
40-
DatasourceID int64 `json:"datasourceId"`
4140
FillMissing *data.FillMissing `json:"fillMode,omitempty"`
4241

4342
// Macros
@@ -55,7 +54,6 @@ func (q *Query) WithSQL(query string) *Query {
5554
RefID: q.RefID,
5655
Interval: q.Interval,
5756
TimeRange: q.TimeRange,
58-
DatasourceID: q.DatasourceID,
5957
MaxDataPoints: q.MaxDataPoints,
6058
FillMissing: q.FillMissing,
6159
Schema: q.Schema,
@@ -80,7 +78,6 @@ func GetQuery(query backend.DataQuery) (*Query, error) {
8078
RefID: query.RefID,
8179
Interval: query.Interval,
8280
TimeRange: query.TimeRange,
83-
DatasourceID: model.DatasourceID,
8481
MaxDataPoints: query.MaxDataPoints,
8582
FillMissing: model.FillMissing,
8683
Schema: model.Schema,

0 commit comments

Comments
 (0)