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

pull/104166/head
Jean-Philippe Quéméner 3 months ago committed by GitHub
parent a02ff218df
commit 3380ea441a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 4
      pkg/storage/unified/resource/server.go
  2. 6
      pkg/storage/unified/sql/backend.go
  3. 26
      pkg/storage/unified/sql/backend_test.go
  4. 3
      pkg/storage/unified/sql/data/resource_history_get.sql
  5. 3
      pkg/storage/unified/sql/data/resource_history_list.sql
  6. 1
      pkg/storage/unified/sql/data/resource_history_poll.sql
  7. 1
      pkg/storage/unified/sql/data/resource_history_read.sql
  8. 3
      pkg/storage/unified/sql/data/resource_list.sql
  9. 1
      pkg/storage/unified/sql/data/resource_read.sql
  10. 1
      pkg/storage/unified/sql/queries.go
  11. 3
      pkg/storage/unified/sql/testdata/mysql--resource_history_get-read object history.sql
  12. 3
      pkg/storage/unified/sql/testdata/mysql--resource_history_get-read trash second page.sql
  13. 3
      pkg/storage/unified/sql/testdata/mysql--resource_history_get-read trash.sql
  14. 3
      pkg/storage/unified/sql/testdata/mysql--resource_history_list-single path.sql
  15. 1
      pkg/storage/unified/sql/testdata/mysql--resource_history_poll-single path.sql
  16. 1
      pkg/storage/unified/sql/testdata/mysql--resource_history_read-single path.sql
  17. 3
      pkg/storage/unified/sql/testdata/mysql--resource_list-filter_on_namespace.sql
  18. 1
      pkg/storage/unified/sql/testdata/mysql--resource_read-without_resource_version.sql
  19. 3
      pkg/storage/unified/sql/testdata/postgres--resource_history_get-read object history.sql
  20. 3
      pkg/storage/unified/sql/testdata/postgres--resource_history_get-read trash second page.sql
  21. 3
      pkg/storage/unified/sql/testdata/postgres--resource_history_get-read trash.sql
  22. 3
      pkg/storage/unified/sql/testdata/postgres--resource_history_list-single path.sql
  23. 1
      pkg/storage/unified/sql/testdata/postgres--resource_history_poll-single path.sql
  24. 1
      pkg/storage/unified/sql/testdata/postgres--resource_history_read-single path.sql
  25. 3
      pkg/storage/unified/sql/testdata/postgres--resource_list-filter_on_namespace.sql
  26. 1
      pkg/storage/unified/sql/testdata/postgres--resource_read-without_resource_version.sql
  27. 3
      pkg/storage/unified/sql/testdata/sqlite--resource_history_get-read object history.sql
  28. 3
      pkg/storage/unified/sql/testdata/sqlite--resource_history_get-read trash second page.sql
  29. 3
      pkg/storage/unified/sql/testdata/sqlite--resource_history_get-read trash.sql
  30. 3
      pkg/storage/unified/sql/testdata/sqlite--resource_history_list-single path.sql
  31. 1
      pkg/storage/unified/sql/testdata/sqlite--resource_history_poll-single path.sql
  32. 1
      pkg/storage/unified/sql/testdata/sqlite--resource_history_read-single path.sql
  33. 3
      pkg/storage/unified/sql/testdata/sqlite--resource_list-filter_on_namespace.sql
  34. 1
      pkg/storage/unified/sql/testdata/sqlite--resource_read-without_resource_version.sql

@ -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

@ -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

@ -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

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

@ -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" }}

@ -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 }},

@ -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 }},

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

@ -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 }},

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Loading…
Cancel
Save