Storage/SQL: Support more filter by namespace/group/resource (#99249)
This commit is contained in:
@@ -1,7 +1,9 @@
|
||||
DELETE FROM {{ .Ident "resource" }}
|
||||
WHERE 1 = 1
|
||||
AND {{ .Ident "namespace" }} = {{ .Arg .WriteEvent.Key.Namespace }}
|
||||
AND {{ .Ident "group" }} = {{ .Arg .WriteEvent.Key.Group }}
|
||||
AND {{ .Ident "resource" }} = {{ .Arg .WriteEvent.Key.Resource }}
|
||||
AND {{ .Ident "name" }} = {{ .Arg .WriteEvent.Key.Name }}
|
||||
WHERE 1 = 1
|
||||
AND {{ .Ident "namespace" }} = {{ .Arg .WriteEvent.Key.Namespace }}
|
||||
AND {{ .Ident "group" }} = {{ .Arg .WriteEvent.Key.Group }}
|
||||
AND {{ .Ident "resource" }} = {{ .Arg .WriteEvent.Key.Resource }}
|
||||
{{ if .WriteEvent.Key.Name }}
|
||||
AND {{ .Ident "name" }} = {{ .Arg .WriteEvent.Key.Name }}
|
||||
{{ end }}
|
||||
;
|
||||
|
||||
@@ -1,4 +1,12 @@
|
||||
DELETE FROM {{ .Ident "resource_history" }}
|
||||
WHERE 1 = 1
|
||||
WHERE {{ .Ident "namespace" }} = {{ .Arg .Namespace }}
|
||||
{{ if .GUID }}
|
||||
AND {{ .Ident "guid" }} = {{ .Arg .GUID }}
|
||||
{{ end }}
|
||||
{{ if .Group }}
|
||||
AND {{ .Ident "group" }} = {{ .Arg .Group }}
|
||||
{{ end }}
|
||||
{{ if .Resource }}
|
||||
AND {{ .Ident "resource" }} = {{ .Arg .Resource }}
|
||||
{{ end }}
|
||||
|
||||
@@ -6,7 +6,9 @@ INSERT INTO {{ .Ident "resource_history" }}
|
||||
{{ .Ident "namespace" }},
|
||||
{{ .Ident "name" }},
|
||||
{{ .Ident "folder" }},
|
||||
|
||||
{{ if gt .ResourceVersion 0 }}
|
||||
{{ .Ident "resource_version" }},
|
||||
{{ end }}
|
||||
{{ .Ident "previous_resource_version"}},
|
||||
{{ .Ident "value" }},
|
||||
{{ .Ident "action" }}
|
||||
@@ -19,7 +21,9 @@ INSERT INTO {{ .Ident "resource_history" }}
|
||||
{{ .Arg .WriteEvent.Key.Namespace }},
|
||||
{{ .Arg .WriteEvent.Key.Name }},
|
||||
{{ .Arg .Folder }},
|
||||
|
||||
{{ if gt .ResourceVersion 0 }}
|
||||
{{ .Arg .ResourceVersion }},
|
||||
{{ end }}
|
||||
{{ .Arg .WriteEvent.PreviousRV }},
|
||||
{{ .Arg .WriteEvent.Value }},
|
||||
{{ .Arg .WriteEvent.Type }}
|
||||
|
||||
@@ -9,6 +9,12 @@ WHERE 1 = 1
|
||||
{{ if .Namespace }}
|
||||
AND {{ .Ident "namespace" }} = {{ .Arg .Namespace }}
|
||||
{{ end}}
|
||||
{{ if .Group }}
|
||||
AND {{ .Ident "group" }} = {{ .Arg .Group }}
|
||||
{{ end}}
|
||||
{{ if .Resource }}
|
||||
AND {{ .Ident "resource" }} = {{ .Arg .Resource }}
|
||||
{{ end}}
|
||||
{{ if .Folder }}
|
||||
AND {{ .Ident "folder" }} = {{ .Arg .Folder }}
|
||||
{{ end}}
|
||||
|
||||
@@ -119,6 +119,7 @@ func (b *backend) runStartupDataMigrations(ctx context.Context) error {
|
||||
_, err = dbutil.Exec(ctx, tx, sqlResourceHistoryDelete, &sqlResourceHistoryDeleteRequest{
|
||||
SQLTemplate: sqltemplate.New(b.dialect),
|
||||
GUID: req.GUID,
|
||||
Namespace: item.Marker.GetNamespace(),
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
|
||||
@@ -78,6 +78,9 @@ type sqlResourceRequest struct {
|
||||
GUID string
|
||||
WriteEvent resource.WriteEvent
|
||||
Folder string
|
||||
|
||||
// Useful when batch writing
|
||||
ResourceVersion int64
|
||||
}
|
||||
|
||||
func (r sqlResourceRequest) Validate() error {
|
||||
@@ -87,6 +90,8 @@ func (r sqlResourceRequest) Validate() error {
|
||||
type sqlStatsRequest struct {
|
||||
sqltemplate.SQLTemplate
|
||||
Namespace string
|
||||
Group string
|
||||
Resource string
|
||||
Folder string
|
||||
MinCount int
|
||||
}
|
||||
@@ -206,11 +211,25 @@ func (r sqlResourceHistoryListRequest) Results() (*resource.ResourceWrapper, err
|
||||
type sqlResourceHistoryDeleteRequest struct {
|
||||
sqltemplate.SQLTemplate
|
||||
GUID string
|
||||
// TODO, add other constraints
|
||||
|
||||
Namespace string
|
||||
Group string
|
||||
Resource string
|
||||
}
|
||||
|
||||
func (r *sqlResourceHistoryDeleteRequest) Validate() error {
|
||||
return nil // TODO
|
||||
if r.Namespace == "" {
|
||||
return fmt.Errorf("missing namespace")
|
||||
}
|
||||
if r.GUID == "" {
|
||||
if r.Group == "" {
|
||||
return fmt.Errorf("missing group")
|
||||
}
|
||||
if r.Resource == "" {
|
||||
return fmt.Errorf("missing resource")
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type sqlGetHistoryRequest struct {
|
||||
|
||||
@@ -284,14 +284,14 @@ func TestUnifiedStorageQueries(t *testing.T) {
|
||||
|
||||
sqlResourceStats: {
|
||||
{
|
||||
Name: "query",
|
||||
Name: "global",
|
||||
Data: &sqlStatsRequest{
|
||||
SQLTemplate: mocks.NewTestingSQLTemplate(),
|
||||
MinCount: 10, // Not yet used in query (only response filter)
|
||||
},
|
||||
},
|
||||
{
|
||||
Name: "query-namespace",
|
||||
Name: "namespace",
|
||||
Data: &sqlStatsRequest{
|
||||
SQLTemplate: mocks.NewTestingSQLTemplate(),
|
||||
Namespace: "default",
|
||||
@@ -299,7 +299,7 @@ func TestUnifiedStorageQueries(t *testing.T) {
|
||||
},
|
||||
},
|
||||
{
|
||||
Name: "query-folder",
|
||||
Name: "folder",
|
||||
Data: &sqlStatsRequest{
|
||||
SQLTemplate: mocks.NewTestingSQLTemplate(),
|
||||
Namespace: "default",
|
||||
@@ -307,6 +307,15 @@ func TestUnifiedStorageQueries(t *testing.T) {
|
||||
MinCount: 10, // Not yet used in query (only response filter)
|
||||
},
|
||||
},
|
||||
{
|
||||
Name: "resource",
|
||||
Data: &sqlStatsRequest{
|
||||
SQLTemplate: mocks.NewTestingSQLTemplate(),
|
||||
Namespace: "default",
|
||||
Group: "dashboard.grafana.app",
|
||||
Resource: "dashboards",
|
||||
},
|
||||
},
|
||||
},
|
||||
sqlResourceBlobInsert: {
|
||||
{
|
||||
@@ -363,6 +372,16 @@ func TestUnifiedStorageQueries(t *testing.T) {
|
||||
Data: &sqlResourceHistoryDeleteRequest{
|
||||
SQLTemplate: mocks.NewTestingSQLTemplate(),
|
||||
GUID: `xxxx`,
|
||||
Namespace: "ns",
|
||||
},
|
||||
},
|
||||
{
|
||||
Name: "wipe",
|
||||
Data: &sqlResourceHistoryDeleteRequest{
|
||||
SQLTemplate: mocks.NewTestingSQLTemplate(),
|
||||
Namespace: "ns",
|
||||
Group: "ggg",
|
||||
Resource: "rrr",
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
DELETE FROM `resource`
|
||||
WHERE 1 = 1
|
||||
AND `namespace` = 'nn'
|
||||
AND `group` = 'gg'
|
||||
AND `resource` = 'rr'
|
||||
AND `name` = 'name'
|
||||
WHERE 1 = 1
|
||||
AND `namespace` = 'nn'
|
||||
AND `group` = 'gg'
|
||||
AND `resource` = 'rr'
|
||||
AND `name` = 'name'
|
||||
;
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
DELETE FROM `resource_history`
|
||||
WHERE 1 = 1
|
||||
WHERE `namespace` = 'ns'
|
||||
AND `guid` = 'xxxx'
|
||||
|
||||
+4
@@ -0,0 +1,4 @@
|
||||
DELETE FROM `resource_history`
|
||||
WHERE `namespace` = 'ns'
|
||||
AND `group` = 'ggg'
|
||||
AND `resource` = 'rrr'
|
||||
+16
@@ -0,0 +1,16 @@
|
||||
SELECT
|
||||
`namespace`,
|
||||
`group`,
|
||||
`resource`,
|
||||
COUNT(*),
|
||||
MAX(`resource_version`)
|
||||
FROM `resource`
|
||||
WHERE 1 = 1
|
||||
AND `namespace` = 'default'
|
||||
AND `group` = 'dashboard.grafana.app'
|
||||
AND `resource` = 'dashboards'
|
||||
GROUP BY
|
||||
`namespace`,
|
||||
`group`,
|
||||
`resource`
|
||||
;
|
||||
@@ -1,7 +1,7 @@
|
||||
DELETE FROM "resource"
|
||||
WHERE 1 = 1
|
||||
AND "namespace" = 'nn'
|
||||
AND "group" = 'gg'
|
||||
AND "resource" = 'rr'
|
||||
AND "name" = 'name'
|
||||
WHERE 1 = 1
|
||||
AND "namespace" = 'nn'
|
||||
AND "group" = 'gg'
|
||||
AND "resource" = 'rr'
|
||||
AND "name" = 'name'
|
||||
;
|
||||
|
||||
+1
-1
@@ -1,3 +1,3 @@
|
||||
DELETE FROM "resource_history"
|
||||
WHERE 1 = 1
|
||||
WHERE "namespace" = 'ns'
|
||||
AND "guid" = 'xxxx'
|
||||
|
||||
+4
@@ -0,0 +1,4 @@
|
||||
DELETE FROM "resource_history"
|
||||
WHERE "namespace" = 'ns'
|
||||
AND "group" = 'ggg'
|
||||
AND "resource" = 'rrr'
|
||||
+16
@@ -0,0 +1,16 @@
|
||||
SELECT
|
||||
"namespace",
|
||||
"group",
|
||||
"resource",
|
||||
COUNT(*),
|
||||
MAX("resource_version")
|
||||
FROM "resource"
|
||||
WHERE 1 = 1
|
||||
AND "namespace" = 'default'
|
||||
AND "group" = 'dashboard.grafana.app'
|
||||
AND "resource" = 'dashboards'
|
||||
GROUP BY
|
||||
"namespace",
|
||||
"group",
|
||||
"resource"
|
||||
;
|
||||
@@ -1,7 +1,7 @@
|
||||
DELETE FROM "resource"
|
||||
WHERE 1 = 1
|
||||
AND "namespace" = 'nn'
|
||||
AND "group" = 'gg'
|
||||
AND "resource" = 'rr'
|
||||
AND "name" = 'name'
|
||||
WHERE 1 = 1
|
||||
AND "namespace" = 'nn'
|
||||
AND "group" = 'gg'
|
||||
AND "resource" = 'rr'
|
||||
AND "name" = 'name'
|
||||
;
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
DELETE FROM "resource_history"
|
||||
WHERE 1 = 1
|
||||
WHERE "namespace" = 'ns'
|
||||
AND "guid" = 'xxxx'
|
||||
|
||||
+4
@@ -0,0 +1,4 @@
|
||||
DELETE FROM "resource_history"
|
||||
WHERE "namespace" = 'ns'
|
||||
AND "group" = 'ggg'
|
||||
AND "resource" = 'rrr'
|
||||
+16
@@ -0,0 +1,16 @@
|
||||
SELECT
|
||||
"namespace",
|
||||
"group",
|
||||
"resource",
|
||||
COUNT(*),
|
||||
MAX("resource_version")
|
||||
FROM "resource"
|
||||
WHERE 1 = 1
|
||||
AND "namespace" = 'default'
|
||||
AND "group" = 'dashboard.grafana.app'
|
||||
AND "resource" = 'dashboards'
|
||||
GROUP BY
|
||||
"namespace",
|
||||
"group",
|
||||
"resource"
|
||||
;
|
||||
Reference in New Issue
Block a user