From 96e57b270dc516c863e76880c29b775092aa37a0 Mon Sep 17 00:00:00 2001 From: Will Assis Date: Fri, 14 Nov 2025 15:21:10 -0300 Subject: [PATCH] implement GetAll in metadatastore --- pkg/storage/unified/resource/metadatastore.go | 31 ++++++- .../unified/resource/metadatastore_test.go | 93 ++++++++++++++----- 2 files changed, 100 insertions(+), 24 deletions(-) diff --git a/pkg/storage/unified/resource/metadatastore.go b/pkg/storage/unified/resource/metadatastore.go index 1b8844cd2dc..785fd0b75b0 100644 --- a/pkg/storage/unified/resource/metadatastore.go +++ b/pkg/storage/unified/resource/metadatastore.go @@ -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 } diff --git a/pkg/storage/unified/resource/metadatastore_test.go b/pkg/storage/unified/resource/metadatastore_test.go index 44572035268..61d8e02abdd 100644 --- a/pkg/storage/unified/resource/metadatastore_test.go +++ b/pkg/storage/unified/resource/metadatastore_test.go @@ -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++ + } + }) }