feat(unified-storage): return guid, group and resource on read/list (#104121)

This commit is contained in:
Jean-Philippe Quéméner 2025-04-17 12:58:58 +02:00 committed by GitHub
parent a02ff218df
commit 3380ea441a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
34 changed files with 106 additions and 21 deletions

View File

@ -1,7 +1,7 @@
package resource
import (
context "context"
"context"
"encoding/json"
"fmt"
"log/slog"
@ -71,6 +71,8 @@ type BackendReadResponse struct {
Key *ResourceKey
Folder string
// GUID that is used internally
GUID string
// The new resource version
ResourceVersion int64
// The properties

View File

@ -21,6 +21,7 @@ import (
apierrors "k8s.io/apimachinery/pkg/api/errors"
"github.com/grafana/grafana-app-sdk/logging"
"github.com/grafana/grafana/pkg/storage/unified/resource"
"github.com/grafana/grafana/pkg/storage/unified/sql/db"
"github.com/grafana/grafana/pkg/storage/unified/sql/dbutil"
@ -593,9 +594,12 @@ type listIter struct {
err error
// The row
guid string
rv int64
value []byte
namespace string
resource string
group string
name string
folder string
}
@ -639,7 +643,7 @@ func (l *listIter) Value() []byte {
func (l *listIter) Next() bool {
if l.rows.Next() {
l.offset++
l.err = l.rows.Scan(&l.rv, &l.namespace, &l.name, &l.folder, &l.value)
l.err = l.rows.Scan(&l.guid, &l.rv, &l.namespace, &l.resource, &l.group, &l.name, &l.folder, &l.value)
return true
}
return false

View File

@ -7,16 +7,17 @@ import (
"fmt"
"testing"
sqlmock "github.com/DATA-DOG/go-sqlmock"
"github.com/DATA-DOG/go-sqlmock"
"github.com/mattn/go-sqlite3"
"github.com/stretchr/testify/require"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"github.com/grafana/grafana/pkg/apimachinery/utils"
"github.com/grafana/grafana/pkg/storage/unified/resource"
"github.com/grafana/grafana/pkg/storage/unified/sql/db/dbimpl"
"github.com/grafana/grafana/pkg/storage/unified/sql/test"
"github.com/grafana/grafana/pkg/util/testutil"
"github.com/stretchr/testify/require"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
)
var (
@ -401,6 +402,7 @@ func TestBackend_delete(t *testing.T) {
}
type readHistoryRow struct {
guid string
namespace string
group string
resource string
@ -418,6 +420,7 @@ func TestBackend_ReadResource(t *testing.T) {
b, ctx := setupBackendTest(t)
expectedReadRow := readHistoryRow{
guid: "guid",
namespace: "ns",
group: "gr",
resource: "rs",
@ -426,11 +429,12 @@ func TestBackend_ReadResource(t *testing.T) {
resource_version: "300",
value: "rv-300",
}
readResource := []string{"namespace", "group", "resource", "name", "folder", "resource_version", "value"}
readResource := []string{"guid", "namespace", "group", "resource", "name", "folder", "resource_version", "value"}
b.SQLMock.ExpectBegin()
b.SQLMock.ExpectQuery("SELECT .* FROM resource").
WillReturnRows(sqlmock.NewRows(readResource).
AddRow(
expectedReadRow.guid,
expectedReadRow.namespace,
expectedReadRow.group,
expectedReadRow.resource,
@ -473,6 +477,7 @@ func TestBackend_ReadResource(t *testing.T) {
b, ctx := setupBackendTest(t)
expectedReadRow := readHistoryRow{
guid: "guid",
namespace: "ns",
group: "gr",
resource: "rs",
@ -482,11 +487,12 @@ func TestBackend_ReadResource(t *testing.T) {
value: "rv-300",
}
readHistoryColumns := []string{"namespace", "group", "resource", "name", "folder", "resource_version", "value"}
readHistoryColumns := []string{"guid", "namespace", "group", "resource", "name", "folder", "resource_version", "value"}
b.SQLMock.ExpectBegin()
b.SQLMock.ExpectQuery("SELECT .* FROM resource_history").
WillReturnRows(sqlmock.NewRows(readHistoryColumns).
AddRow(
expectedReadRow.guid,
expectedReadRow.namespace,
expectedReadRow.group,
expectedReadRow.resource,
@ -534,7 +540,7 @@ func TestBackend_getHistory(t *testing.T) {
Name: "nm",
}
rv1, rv2, rv3 := int64(100), int64(200), int64(300)
cols := []string{"resource_version", "namespace", "name", "folder", "value"}
cols := []string{"guid", "resource_version", "namespace", "group", "resource", "name", "folder", "value"}
tests := []struct {
name string
@ -657,8 +663,11 @@ func TestBackend_getHistory(t *testing.T) {
historyRows := sqlmock.NewRows(cols)
for _, rv := range tc.expectedVersions {
historyRows.AddRow(
"guid", // guid
rv, // resource_version
"ns", // namespace
"gr", // group
"rs", // resource
"nm", // name
"folder", // folder
[]byte(fmt.Sprintf("rv-%d", rv)), // value
@ -829,12 +838,15 @@ func setupHistoryTest(b testBackend, resourceVersions []int64, latestRV int64, e
}
// Create the mock rows for the history items
cols := []string{"resource_version", "namespace", "name", "folder", "value"}
cols := []string{"guid", "resource_version", "namespace", "group", "resource", "name", "folder", "value"}
historyRows := sqlmock.NewRows(cols)
for _, rv := range resourceVersions {
historyRows.AddRow(
"guid", // guid
rv, // resource_version
"ns", // namespace
"gr", // group
"rs", // resource
"nm", // name
"folder", // folder
[]byte(fmt.Sprintf("rv-%d", rv)), // value

View File

@ -1,6 +1,9 @@
SELECT
{{ .Ident "guid" }},
{{ .Ident "resource_version" }},
{{ .Ident "namespace" }},
{{ .Ident "group" }},
{{ .Ident "resource" }},
{{ .Ident "name" }},
{{ .Ident "folder" }},
{{ .Ident "value" }}

View File

@ -1,6 +1,9 @@
SELECT
kv.{{ .Ident "guid" }},
kv.{{ .Ident "resource_version" }},
kv.{{ .Ident "namespace" }},
kv.{{ .Ident "group" }},
kv.{{ .Ident "resource" }},
kv.{{ .Ident "name" }},
kv.{{ .Ident "folder" }},
kv.{{ .Ident "value" }}

View File

@ -1,4 +1,5 @@
SELECT
{{ .Ident "guid" | .Into .Response.GUID }},
{{ .Ident "resource_version" | .Into .Response.ResourceVersion }},
{{ .Ident "namespace" | .Into .Response.Key.Namespace }},
{{ .Ident "group" | .Into .Response.Key.Group }},

View File

@ -1,4 +1,5 @@
SELECT
{{ .Ident "guid" | .Into .Response.GUID }},
{{ .Ident "namespace" | .Into .Response.Key.Namespace }},
{{ .Ident "group" | .Into .Response.Key.Group }},
{{ .Ident "resource" | .Into .Response.Key.Resource }},

View File

@ -1,6 +1,9 @@
SELECT
{{ .Ident "guid" }},
{{ .Ident "resource_version" }},
{{ .Ident "namespace" }},
{{ .Ident "group" }},
{{ .Ident "resource" }},
{{ .Ident "name" }},
{{ .Ident "folder" }},
{{ .Ident "value" }}

View File

@ -1,4 +1,5 @@
SELECT
{{ .Ident "guid" | .Into .Response.GUID }},
{{ .Ident "namespace" | .Into .Response.Key.Namespace }},
{{ .Ident "group" | .Into .Response.Key.Group }},
{{ .Ident "resource" | .Into .Response.Key.Resource }},

View File

@ -116,6 +116,7 @@ func (r sqlStatsRequest) Validate() error {
type historyPollResponse struct {
Key resource.ResourceKey
GUID string
ResourceVersion int64
PreviousRV *int64
Value []byte

View File

@ -1,6 +1,9 @@
SELECT
`guid`,
`resource_version`,
`namespace`,
`group`,
`resource`,
`name`,
`folder`,
`value`

View File

@ -1,6 +1,9 @@
SELECT
`guid`,
`resource_version`,
`namespace`,
`group`,
`resource`,
`name`,
`folder`,
`value`

View File

@ -1,6 +1,9 @@
SELECT
`guid`,
`resource_version`,
`namespace`,
`group`,
`resource`,
`name`,
`folder`,
`value`

View File

@ -1,6 +1,9 @@
SELECT
kv.`guid`,
kv.`resource_version`,
kv.`namespace`,
kv.`group`,
kv.`resource`,
kv.`name`,
kv.`folder`,
kv.`value`

View File

@ -1,4 +1,5 @@
SELECT
`guid`,
`resource_version`,
`namespace`,
`group`,

View File

@ -1,4 +1,5 @@
SELECT
`guid`,
`namespace`,
`group`,
`resource`,

View File

@ -1,6 +1,9 @@
SELECT
`guid`,
`resource_version`,
`namespace`,
`group`,
`resource`,
`name`,
`folder`,
`value`

View File

@ -1,4 +1,5 @@
SELECT
`guid`,
`namespace`,
`group`,
`resource`,

View File

@ -1,6 +1,9 @@
SELECT
"guid",
"resource_version",
"namespace",
"group",
"resource",
"name",
"folder",
"value"

View File

@ -1,6 +1,9 @@
SELECT
"guid",
"resource_version",
"namespace",
"group",
"resource",
"name",
"folder",
"value"

View File

@ -1,6 +1,9 @@
SELECT
"guid",
"resource_version",
"namespace",
"group",
"resource",
"name",
"folder",
"value"

View File

@ -1,6 +1,9 @@
SELECT
kv."guid",
kv."resource_version",
kv."namespace",
kv."group",
kv."resource",
kv."name",
kv."folder",
kv."value"

View File

@ -1,4 +1,5 @@
SELECT
"guid",
"resource_version",
"namespace",
"group",

View File

@ -1,4 +1,5 @@
SELECT
"guid",
"namespace",
"group",
"resource",

View File

@ -1,6 +1,9 @@
SELECT
"guid",
"resource_version",
"namespace",
"group",
"resource",
"name",
"folder",
"value"

View File

@ -1,4 +1,5 @@
SELECT
"guid",
"namespace",
"group",
"resource",

View File

@ -1,6 +1,9 @@
SELECT
"guid",
"resource_version",
"namespace",
"group",
"resource",
"name",
"folder",
"value"

View File

@ -1,6 +1,9 @@
SELECT
"guid",
"resource_version",
"namespace",
"group",
"resource",
"name",
"folder",
"value"

View File

@ -1,6 +1,9 @@
SELECT
"guid",
"resource_version",
"namespace",
"group",
"resource",
"name",
"folder",
"value"

View File

@ -1,6 +1,9 @@
SELECT
kv."guid",
kv."resource_version",
kv."namespace",
kv."group",
kv."resource",
kv."name",
kv."folder",
kv."value"

View File

@ -1,4 +1,5 @@
SELECT
"guid",
"resource_version",
"namespace",
"group",

View File

@ -1,4 +1,5 @@
SELECT
"guid",
"namespace",
"group",
"resource",

View File

@ -1,6 +1,9 @@
SELECT
"guid",
"resource_version",
"namespace",
"group",
"resource",
"name",
"folder",
"value"

View File

@ -1,4 +1,5 @@
SELECT
"guid",
"namespace",
"group",
"resource",