DataSource: Support config CRUD from apiservers (#106996)

This commit is contained in:
Ryan McKinley
2025-08-28 22:28:26 +03:00
committed by GitHub
parent 15fab1cb99
commit eda94a6434
61 changed files with 2041 additions and 468 deletions
+17
View File
@@ -0,0 +1,17 @@
apiVersion: testdata.datasource.grafana.app/v0alpha1
kind: DataSource
metadata:
name: sample-testdata
spec:
title: Sample datasource
access: proxy
isDefault: true
jsonData:
key: value
hello: 10
world: false
secure:
sampleA:
create: secret value here # replaced with UID on write
sampleB:
name: XYZ # reference to a existing secret
+46 -82
View File
@@ -2,13 +2,16 @@ package dashboards
import (
"context"
"encoding/json"
"fmt"
"testing"
"github.com/stretchr/testify/require"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/runtime/schema"
"github.com/grafana/grafana/pkg/components/simplejson"
"github.com/grafana/grafana/pkg/services/datasources"
"github.com/grafana/grafana/pkg/services/featuremgmt"
"github.com/grafana/grafana/pkg/tests/apis"
@@ -38,97 +41,58 @@ func TestIntegrationTestDatasource(t *testing.T) {
Type: datasources.DS_TESTDATA,
UID: "test",
OrgID: int64(1),
// These settings are not actually used, but testing that they get saved
Database: "testdb",
URL: "http://fake.url",
Access: datasources.DS_ACCESS_PROXY,
User: "example",
ReadOnly: true,
JsonData: simplejson.NewFromAny(map[string]any{
"hello": "world",
}),
SecureJsonData: map[string]string{
"aaa": "AAA",
"bbb": "BBB",
},
})
require.Equal(t, "test", ds.UID)
t.Run("Check discovery client", func(t *testing.T) {
disco := helper.GetGroupVersionInfoJSON("testdata.datasource.grafana.app")
fmt.Printf("%s", disco)
t.Run("Admin configs", func(t *testing.T) {
client := helper.Org1.Admin.ResourceClient(t, schema.GroupVersionResource{
Group: "testdata.datasource.grafana.app",
Version: "v0alpha1",
Resource: "datasources",
}).Namespace("default")
ctx := context.Background()
require.JSONEq(t, `[
{
"freshness": "Current",
"resources": [
{
"resource": "connections",
"responseKind": {
"group": "",
"kind": "DataSourceConnection",
"version": ""
},
"scope": "Namespaced",
"shortNames": [
"grafana-testdata-datasource-connection"
],
"singularResource": "connection",
"subresources": [
{
"responseKind": {
"group": "",
"kind": "HealthCheckResult",
"version": ""
},
"subresource": "health",
"verbs": [
"get"
]
},
{
"responseKind": {
"group": "",
"kind": "QueryDataResponse",
"version": ""
},
"subresource": "query",
"verbs": [
"create"
]
},
{
"responseKind": {
"group": "",
"kind": "Status",
"version": ""
},
"subresource": "resource",
"verbs": [
"create",
"delete",
"get",
"patch",
"update"
]
}
],
"verbs": [
"get",
"list"
]
},
{
"resource": "queryconvert",
"responseKind": {
"group": "",
"kind": "QueryDataRequest",
"version": ""
},
"scope": "Namespaced",
"singularResource": "queryconvert",
"verbs": [
"create"
]
}
],
"version": "v0alpha1"
}
]`, disco)
list, err := client.List(ctx, metav1.ListOptions{})
require.NoError(t, err)
require.Len(t, list.Items, 1, "expected a single connection")
require.Equal(t, "test", list.Items[0].GetName(), "with the test uid")
spec, _, _ := unstructured.NestedMap(list.Items[0].Object, "spec")
jj, _ := json.MarshalIndent(spec, "", " ")
fmt.Printf("%s\n", string(jj))
require.JSONEq(t, `{
"access": "proxy",
"database": "testdb",
"isDefault": true,
"jsonData": {
"hello": "world"
},
"readOnly": true,
"title": "test",
"url": "http://fake.url",
"user": "example"
}`, string(jj))
})
t.Run("Call subresources", func(t *testing.T) {
client := helper.Org1.Admin.ResourceClient(t, schema.GroupVersionResource{
Group: "testdata.datasource.grafana.app",
Version: "v0alpha1",
Resource: "connections",
Resource: "datasources",
}).Namespace("default")
ctx := context.Background()
@@ -155,7 +119,7 @@ func TestIntegrationTestDatasource(t *testing.T) {
raw := apis.DoRequest[any](helper, apis.RequestParams{
User: helper.Org1.Admin,
Method: "GET",
Path: "/apis/testdata.datasource.grafana.app/v0alpha1/namespaces/default/connections/test/resource",
Path: "/apis/testdata.datasource.grafana.app/v0alpha1/namespaces/default/datasources/test/resource",
}, nil)
require.Equal(t, `Hello world from test datasource!`, string(raw.Body))
})