mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
K8s/Folders: Add folders api service (with legacy storage) (#79413)
This commit is contained in:
@@ -7,7 +7,7 @@ import (
|
||||
)
|
||||
|
||||
func initEntityTables(mg *migrator.Migrator) string {
|
||||
marker := "Initialize entity tables (v007)" // changing this key wipe+rewrite everything
|
||||
marker := "Initialize entity tables (v008)" // changing this key wipe+rewrite everything
|
||||
mg.AddMigration(marker, &migrator.RawSQLMigration{})
|
||||
|
||||
tables := []migrator.Table{}
|
||||
@@ -128,7 +128,6 @@ func initEntityTables(mg *migrator.Migrator) string {
|
||||
{Name: "guid", Type: migrator.DB_NVarchar, Length: 36, Nullable: false, IsPrimaryKey: true},
|
||||
{Name: "namespace", Type: migrator.DB_NVarchar, Length: 63, Nullable: false},
|
||||
{Name: "name", Type: migrator.DB_NVarchar, Length: 190, Nullable: false},
|
||||
{Name: "title", Type: migrator.DB_NVarchar, Length: 190, Nullable: false},
|
||||
{Name: "slug_path", Type: migrator.DB_Text, Nullable: false}, // /slug/slug/slug/
|
||||
{Name: "tree", Type: migrator.DB_Text, Nullable: false}, // JSON []{uid, title}
|
||||
{Name: "depth", Type: migrator.DB_Int, Nullable: false}, // starts at 1
|
||||
|
||||
@@ -7,9 +7,6 @@ import context "context"
|
||||
//-----------------------------------------------------------------------------------------------------
|
||||
|
||||
const (
|
||||
FolderGroupName = "folder.grafana.app"
|
||||
FolderResourceName = "folders"
|
||||
|
||||
StandardKindDashboard = "dashboard"
|
||||
StandardKindPlaylist = "playlist"
|
||||
StandardKindFolder = "folder"
|
||||
|
||||
@@ -4,8 +4,8 @@ import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
|
||||
foldersV0 "github.com/grafana/grafana/pkg/apis/folders/v0alpha1"
|
||||
"github.com/grafana/grafana/pkg/services/sqlstore/session"
|
||||
"github.com/grafana/grafana/pkg/services/store/entity"
|
||||
)
|
||||
|
||||
type folderInfo struct {
|
||||
@@ -34,17 +34,17 @@ type folderInfo struct {
|
||||
// This will replace all entries in `entity_folder`
|
||||
// This is pretty heavy weight, but it does give us a sorted folder list
|
||||
// NOTE: this could be done async with a mutex/lock? reconciler pattern
|
||||
func updateFolderTree(ctx context.Context, tx *session.SessionTx, namespace string) error {
|
||||
func (s *sqlEntityServer) updateFolderTree(ctx context.Context, tx *session.SessionTx, namespace string) error {
|
||||
_, err := tx.Exec(ctx, "DELETE FROM entity_folder WHERE namespace=?", namespace)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
query := "SELECT guid,uid,folder,name,slug" +
|
||||
query := "SELECT guid,name,folder,name,slug" +
|
||||
" FROM entity" +
|
||||
" WHERE group=? AND resource=? AND namespace=?" +
|
||||
" WHERE " + s.dialect.Quote("group") + "=? AND resource=? AND namespace=?" +
|
||||
" ORDER BY slug asc"
|
||||
args := []interface{}{entity.FolderGroupName, entity.FolderResourceName, namespace}
|
||||
args := []interface{}{foldersV0.GROUP, foldersV0.RESOURCE, namespace}
|
||||
|
||||
all := []*folderInfo{}
|
||||
rows, err := tx.Query(ctx, query, args...)
|
||||
@@ -141,7 +141,7 @@ func insertFolderInfo(ctx context.Context, tx *session.SessionTx, namespace stri
|
||||
js, _ := json.Marshal(folder.stack)
|
||||
_, err := tx.Exec(ctx,
|
||||
`INSERT INTO entity_folder `+
|
||||
"(guid, namespace, uid, slug_path, tree, depth, lft, rgt, detached) "+
|
||||
"(guid, namespace, name, slug_path, tree, depth, lft, rgt, detached) "+
|
||||
`VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,
|
||||
folder.Guid,
|
||||
namespace,
|
||||
|
||||
@@ -14,6 +14,8 @@ import (
|
||||
|
||||
"github.com/bwmarrin/snowflake"
|
||||
"github.com/google/uuid"
|
||||
|
||||
foldersV0 "github.com/grafana/grafana/pkg/apis/folders/v0alpha1"
|
||||
"github.com/grafana/grafana/pkg/infra/appcontext"
|
||||
"github.com/grafana/grafana/pkg/infra/log"
|
||||
"github.com/grafana/grafana/pkg/services/sqlstore/migrator"
|
||||
@@ -471,10 +473,10 @@ func (s *sqlEntityServer) Create(ctx context.Context, r *entity.CreateEntityRequ
|
||||
}
|
||||
|
||||
switch current.Group {
|
||||
case entity.FolderGroupName:
|
||||
case foldersV0.GROUP:
|
||||
switch current.Resource {
|
||||
case entity.FolderResourceName:
|
||||
err = updateFolderTree(ctx, tx, current.Namespace)
|
||||
case foldersV0.RESOURCE:
|
||||
err = s.updateFolderTree(ctx, tx, current.Namespace)
|
||||
if err != nil {
|
||||
s.log.Error("error updating folder tree", "msg", err.Error())
|
||||
return err
|
||||
@@ -707,10 +709,10 @@ func (s *sqlEntityServer) Update(ctx context.Context, r *entity.UpdateEntityRequ
|
||||
}
|
||||
|
||||
switch current.Group {
|
||||
case entity.FolderGroupName:
|
||||
case foldersV0.GROUP:
|
||||
switch current.Resource {
|
||||
case entity.FolderResourceName:
|
||||
err = updateFolderTree(ctx, tx, current.Namespace)
|
||||
case foldersV0.RESOURCE:
|
||||
err = s.updateFolderTree(ctx, tx, current.Namespace)
|
||||
if err != nil {
|
||||
s.log.Error("error updating folder tree", "msg", err.Error())
|
||||
return err
|
||||
@@ -825,10 +827,10 @@ func (s *sqlEntityServer) doDelete(ctx context.Context, tx *session.SessionTx, e
|
||||
}
|
||||
|
||||
switch ent.Group {
|
||||
case entity.FolderGroupName:
|
||||
case foldersV0.GROUP:
|
||||
switch ent.Resource {
|
||||
case entity.FolderResourceName:
|
||||
err = updateFolderTree(ctx, tx, ent.Namespace)
|
||||
case foldersV0.RESOURCE:
|
||||
err = s.updateFolderTree(ctx, tx, ent.Namespace)
|
||||
if err != nil {
|
||||
s.log.Error("error updating folder tree", "msg", err.Error())
|
||||
return err
|
||||
|
||||
Reference in New Issue
Block a user