implement GetAll in metadatastore

This commit is contained in:
Will Assis
2025-12-02 15:17:04 -03:00
parent 50393d3a63
commit 96e57b270d
2 changed files with 100 additions and 24 deletions
+28 -3
View File
@@ -4,13 +4,14 @@ import (
"context"
"encoding/json"
"fmt"
"iter"
"time"
"github.com/grafana/grafana/pkg/apimachinery/validation"
)
const (
metadatasSection = "unified/metadata"
metadataSection = "unified/metadata"
)
type metadataStore struct {
@@ -58,7 +59,11 @@ func (d *metadataStore) Get(ctx context.Context, key MetadataKey) (Metadata, err
return Metadata{}, fmt.Errorf("invalid metadata key: %w", err)
}
reader, err := d.kv.Get(ctx, metadatasSection, key.String())
return d.get(ctx, key.String())
}
func (d *metadataStore) get(ctx context.Context, key string) (Metadata, error) {
reader, err := d.kv.Get(ctx, metadataSection, key)
if err != nil {
return Metadata{}, err
}
@@ -70,6 +75,26 @@ func (d *metadataStore) Get(ctx context.Context, key MetadataKey) (Metadata, err
return metadata, nil
}
func (d *metadataStore) GetAll(ctx context.Context) iter.Seq2[Metadata, error] {
opts := ListOptions{
Sort: SortOrderAsc,
StartKey: "",
}
return func(yield func(Metadata, error) bool) {
for metadataKey, err := range d.kv.Keys(ctx, metadataSection, opts) {
if err != nil {
yield(Metadata{}, err)
return
}
metadata, err := d.get(ctx, metadataKey)
if !yield(metadata, err) {
return
}
}
}
}
func (d *metadataStore) Save(ctx context.Context, metadata Metadata) error {
metadataKey := MetadataKey{
Namespace: metadata.Namespace,
@@ -81,7 +106,7 @@ func (d *metadataStore) Save(ctx context.Context, metadata Metadata) error {
return fmt.Errorf("invalid metadataKey key: %w", err)
}
writer, err := d.kv.Save(ctx, metadatasSection, metadataKey.String())
writer, err := d.kv.Save(ctx, metadataSection, metadataKey.String())
if err != nil {
return err
}
@@ -27,9 +27,9 @@ func TestNewMetadataStore(t *testing.T) {
func TestMetadataStore_MetadataKey_String(t *testing.T) {
tests := []struct {
name string
name string
metadataKey MetadataKey
expected string
expected string
}{
{
name: "basic event key",
@@ -116,27 +116,78 @@ func TestMetadataStore_MetadataKey_Validate(t *testing.T) {
}
}
func TestMetadataStore_Save_Get(t *testing.T) {
ctx := context.Background()
store := setupTestMetadataStore(t)
func TestMetadataStore(t *testing.T) {
metadata := Metadata{
Namespace: "default",
Group: "apps",
Resource: "resource",
LastImportTime: time.Now().Truncate(time.Microsecond),
}
t.Run("Save and Get", func(t *testing.T) {
ctx := context.Background()
store := setupTestMetadataStore(t)
metadata := Metadata{
Namespace: "default",
Group: "apps",
Resource: "resource",
LastImportTime: time.Now().Truncate(time.Microsecond),
}
err := store.Save(ctx, metadata)
require.NoError(t, err)
err := store.Save(ctx, metadata)
require.NoError(t, err)
metadataKey := MetadataKey{
Namespace: "default",
Group: "apps",
Resource: "resource",
}
metadataKey := MetadataKey{
Namespace: "default",
Group: "apps",
Resource: "resource",
}
retrievedMetadata, err := store.Get(ctx, metadataKey)
require.NoError(t, err)
assert.Equal(t, metadata, retrievedMetadata)
retrievedMetadata, err := store.Get(ctx, metadataKey)
require.NoError(t, err)
assert.Equal(t, metadata, retrievedMetadata)
})
t.Run("GetAll", func(t *testing.T) {
ctx := context.Background()
store := setupTestMetadataStore(t)
metadatas := []Metadata{
{
Namespace: "stacks-1",
Group: "apps",
Resource: "resource",
LastImportTime: time.Now().Add(-2 * time.Minute).Truncate(time.Microsecond),
},
{
Namespace: "stacks-2",
Group: "apps",
Resource: "resource",
LastImportTime: time.Now().Add(-7 * time.Minute).Truncate(time.Microsecond),
},
{
Namespace: "stacks-3",
Group: "apps",
Resource: "resource",
LastImportTime: time.Now().Add(-3 * time.Minute).Truncate(time.Microsecond),
},
{
Namespace: "stacks-4",
Group: "apps",
Resource: "resource",
LastImportTime: time.Now().Add(-24 * time.Minute).Truncate(time.Microsecond),
},
{
Namespace: "stacks-5",
Group: "apps",
Resource: "resource",
LastImportTime: time.Now().Add(-44 * time.Minute).Truncate(time.Microsecond),
},
}
for _, metadata := range metadatas {
err := store.Save(ctx, metadata)
require.NoError(t, err)
}
var i int
for metadata, err := range store.GetAll(ctx) {
require.NoError(t, err)
require.Equal(t, metadatas[i], metadata)
i++
}
})
}