mirror of https://github.com/grafana/grafana.git
140 lines
3.8 KiB
Go
140 lines
3.8 KiB
Go
package resource
|
|
|
|
import (
|
|
"context"
|
|
"embed"
|
|
"encoding/json"
|
|
"fmt"
|
|
"os"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/hack-pad/hackpadfs"
|
|
hackos "github.com/hack-pad/hackpadfs/os"
|
|
"github.com/stretchr/testify/require"
|
|
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
|
|
|
|
"github.com/grafana/grafana/pkg/apimachinery/identity"
|
|
"github.com/grafana/grafana/pkg/apimachinery/utils"
|
|
)
|
|
|
|
func TestSimpleServer(t *testing.T) {
|
|
testUserA := &identity.StaticRequester{
|
|
Namespace: identity.NamespaceUser,
|
|
UserID: 123,
|
|
UserUID: "u123",
|
|
OrgRole: identity.RoleAdmin,
|
|
IsGrafanaAdmin: true, // can do anything
|
|
}
|
|
ctx := identity.WithRequester(context.Background(), testUserA)
|
|
|
|
var root hackpadfs.FS
|
|
if true {
|
|
tmp, err := os.MkdirTemp("", "xxx-*")
|
|
require.NoError(t, err)
|
|
|
|
root, err = hackos.NewFS().Sub(tmp[1:])
|
|
require.NoError(t, err)
|
|
fmt.Printf("ROOT: %s\n\n", tmp)
|
|
}
|
|
|
|
server, err := NewResourceServer(ResourceServerOptions{
|
|
Store: NewFileSystemStore(FileSystemOptions{
|
|
Root: root,
|
|
}),
|
|
})
|
|
require.NoError(t, err)
|
|
|
|
t.Run("playlist happy CRUD paths", func(t *testing.T) {
|
|
raw := testdata(t, "01_create_playlist.json")
|
|
key := &ResourceKey{
|
|
Group: "playlist.grafana.app",
|
|
Resource: "rrrr", // can be anything :(
|
|
Namespace: "default",
|
|
Name: "fdgsv37qslr0ga",
|
|
}
|
|
|
|
// Should be empty when we start
|
|
all, err := server.List(ctx, &ListRequest{Options: &ListOptions{
|
|
Key: &ResourceKey{
|
|
Group: key.Group,
|
|
Resource: key.Resource,
|
|
},
|
|
}})
|
|
require.NoError(t, err)
|
|
require.Len(t, all.Items, 0)
|
|
|
|
created, err := server.Create(ctx, &CreateRequest{
|
|
Value: raw,
|
|
Key: key,
|
|
})
|
|
require.NoError(t, err)
|
|
require.Nil(t, created.Status)
|
|
require.True(t, created.ResourceVersion > 0)
|
|
|
|
// The key does not include resource version
|
|
found, err := server.Read(ctx, &ReadRequest{Key: key})
|
|
require.NoError(t, err)
|
|
require.Nil(t, found.Status)
|
|
require.Equal(t, created.ResourceVersion, found.ResourceVersion)
|
|
|
|
// Now update the value
|
|
tmp := &unstructured.Unstructured{}
|
|
err = json.Unmarshal(created.Value, tmp)
|
|
require.NoError(t, err)
|
|
|
|
now := time.Now().UnixMilli()
|
|
obj, err := utils.MetaAccessor(tmp)
|
|
require.NoError(t, err)
|
|
obj.SetAnnotation("test", "hello")
|
|
obj.SetUpdatedTimestampMillis(now)
|
|
obj.SetUpdatedBy(testUserA.GetUID().String())
|
|
raw, err = json.Marshal(tmp)
|
|
require.NoError(t, err)
|
|
|
|
updated, err := server.Update(ctx, &UpdateRequest{
|
|
Key: key,
|
|
Value: raw,
|
|
ResourceVersion: created.ResourceVersion})
|
|
require.NoError(t, err)
|
|
require.Nil(t, updated.Status)
|
|
require.True(t, updated.ResourceVersion > created.ResourceVersion)
|
|
|
|
// We should still get the latest
|
|
found, err = server.Read(ctx, &ReadRequest{Key: key})
|
|
require.NoError(t, err)
|
|
require.Nil(t, found.Status)
|
|
require.Equal(t, updated.ResourceVersion, found.ResourceVersion)
|
|
|
|
all, err = server.List(ctx, &ListRequest{Options: &ListOptions{
|
|
Key: &ResourceKey{
|
|
Group: key.Group,
|
|
Resource: key.Resource,
|
|
},
|
|
}})
|
|
require.NoError(t, err)
|
|
require.Len(t, all.Items, 1)
|
|
require.Equal(t, updated.ResourceVersion, all.Items[0].ResourceVersion)
|
|
|
|
deleted, err := server.Delete(ctx, &DeleteRequest{Key: key, ResourceVersion: updated.ResourceVersion})
|
|
require.NoError(t, err)
|
|
require.True(t, deleted.ResourceVersion > updated.ResourceVersion)
|
|
|
|
// We should get not found status when trying to read the latest value
|
|
found, err = server.Read(ctx, &ReadRequest{Key: key})
|
|
require.NoError(t, err)
|
|
require.NotNil(t, found.Status)
|
|
require.Equal(t, int32(404), found.Status.Code)
|
|
})
|
|
}
|
|
|
|
//go:embed testdata/*
|
|
var testdataFS embed.FS
|
|
|
|
func testdata(t *testing.T, filename string) []byte {
|
|
t.Helper()
|
|
b, err := testdataFS.ReadFile(`testdata/` + filename)
|
|
require.NoError(t, err)
|
|
return b
|
|
}
|