From be5f95c2faa57957deeaa4a50c6aa85bdb3c0aad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Sterba?= <andre@sterba.dev> Date: Fri, 25 Apr 2025 08:25:35 +0200 Subject: [PATCH] init store --- kms/internal/core/model/config.go | 10 +++ kms/internal/core/ports/store.go | 5 ++ .../infrastructure/interaction/config.go | 27 +++++++ .../infrastructure/store/kms-config.go | 63 +++++++++++++++ .../infrastructure/store/kms-config_test.go | 78 +++++++++++++++++++ 5 files changed, 183 insertions(+) create mode 100644 kms/internal/core/model/config.go create mode 100644 kms/internal/infrastructure/interaction/config.go create mode 100644 kms/internal/infrastructure/store/kms-config.go create mode 100644 kms/internal/infrastructure/store/kms-config_test.go diff --git a/kms/internal/core/model/config.go b/kms/internal/core/model/config.go new file mode 100644 index 00000000..b9e13a28 --- /dev/null +++ b/kms/internal/core/model/config.go @@ -0,0 +1,10 @@ +package model + +import "github.com/google/uuid" + +type KMSConfig struct { + ID uuid.UUID + Name string + IntercomBind string + QuantumPushAddrBind string +} diff --git a/kms/internal/core/ports/store.go b/kms/internal/core/ports/store.go index dc57456d..292d00c8 100644 --- a/kms/internal/core/ports/store.go +++ b/kms/internal/core/ports/store.go @@ -13,3 +13,8 @@ type RouteStore interface { GetRouteList(context.Context) ([]model.Route, error) UpdateRoute(context.Context, model.Route) error } + +type KMSConfigStore interface { + GetKMSConfig(context.Context) (model.KMSConfig, error) + SetKMSConfig(context.Context, model.KMSConfig) error +} diff --git a/kms/internal/infrastructure/interaction/config.go b/kms/internal/infrastructure/interaction/config.go new file mode 100644 index 00000000..4b743325 --- /dev/null +++ b/kms/internal/infrastructure/interaction/config.go @@ -0,0 +1,27 @@ +package interaction + +import ( + pb "code.fbi.h-da.de/danet/costaquanta/gen/go/kms/v1" + + "go.opentelemetry.io/otel/trace" + "go.uber.org/zap" +) + +type ConfigServer struct { + pb.UnimplementedConfigServiceServer + + logger *zap.SugaredLogger + tracer trace.Tracer +} + +func NewConfigServer( + logger *zap.SugaredLogger, + tracer trace.Tracer, +) *RoutingServer { + s := &RoutingServer{ + logger: logger, + tracer: tracer, + } + + return s +} diff --git a/kms/internal/infrastructure/store/kms-config.go b/kms/internal/infrastructure/store/kms-config.go new file mode 100644 index 00000000..091a9056 --- /dev/null +++ b/kms/internal/infrastructure/store/kms-config.go @@ -0,0 +1,63 @@ +package store + +import ( + "context" + "sync" + + "code.fbi.h-da.de/danet/costaquanta/kms/internal/core/model" + "go.opentelemetry.io/otel/trace" + "go.uber.org/zap" +) + +type InMemoryKMSConfigStore struct { + kmsConfig model.KMSConfig + + // Using a RWMutex to allow multiple readers concurrently. + // A write lock can only be acquired once all readers are done and release their locks. + mu sync.RWMutex + + logger *zap.SugaredLogger + tracer trace.Tracer +} + +func NewInMemoryKMSConfigStore( + logger *zap.SugaredLogger, + tracer trace.Tracer, +) *InMemoryKMSConfigStore { + return &InMemoryKMSConfigStore{ + kmsConfig: model.KMSConfig{}, + mu: sync.RWMutex{}, + logger: logger, + tracer: tracer, + } +} + +func (s *InMemoryKMSConfigStore) GetKMSConfig(ctx context.Context) (model.KMSConfig, error) { + _, span := s.tracer.Start(ctx, "get-kms-config") + defer span.End() + + s.logger.Debug("Getting KMS config from store") + + s.mu.RLock() + defer s.mu.RUnlock() + + return s.kmsConfig, nil +} + +func (s *InMemoryKMSConfigStore) SetKMSConfig( + ctx context.Context, + kmsConfig model.KMSConfig, +) error { + _, span := s.tracer.Start(ctx, "set-kms-config") + defer span.End() + + s.logger.Debug( + "Setting KMS config in store") + + s.mu.Lock() + defer s.mu.Unlock() + + s.kmsConfig = kmsConfig + + return nil +} diff --git a/kms/internal/infrastructure/store/kms-config_test.go b/kms/internal/infrastructure/store/kms-config_test.go new file mode 100644 index 00000000..78ac0cdf --- /dev/null +++ b/kms/internal/infrastructure/store/kms-config_test.go @@ -0,0 +1,78 @@ +package store + +import ( + "context" + "testing" + + "code.fbi.h-da.de/danet/costaquanta/kms/internal/core/model" + "code.fbi.h-da.de/danet/costaquanta/libs/logging" + "github.com/google/uuid" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.opentelemetry.io/otel/trace/noop" +) + +func createCtxAndConfigStoreForTest() (*InMemoryKMSConfigStore, context.Context) { + tracer := noop.NewTracerProvider().Tracer("routeStoreTest") + + parentLogger := logging.CreateProductionLogger("kms") + childLogger := logging.CreateChildLogger(parentLogger, "routeStoreTest") + + ctx := context.Background() + + return NewInMemoryKMSConfigStore(childLogger, tracer), ctx +} + +func TestInMemoryKMSConfigStore_GetKMSConfig(t *testing.T) { + t.Parallel() + + t.Run("Get non-existing KMS config from store", func(t *testing.T) { + t.Parallel() + store, ctx := createCtxAndConfigStoreForTest() + + kmsConfig, err := store.GetKMSConfig(ctx) + require.NoError(t, err) + assert.Equal(t, model.KMSConfig{}, kmsConfig) + }) + + t.Run("Get existing KMS config from store", func(t *testing.T) { + t.Parallel() + store, ctx := createCtxAndConfigStoreForTest() + + testUUID := uuid.New() + + kmsConfig := model.KMSConfig{ + ID: testUUID, + Name: "test", + IntercomBind: "1337", + QuantumPushAddrBind: "4242", + } + store.kmsConfig = kmsConfig + + retrievedKMSConfig, err := store.GetKMSConfig(ctx) + require.NoError(t, err) + assert.Equal(t, kmsConfig, retrievedKMSConfig) + }) +} + +func TestInMemoryKMSConfigStore_SetKMSConfig(t *testing.T) { + t.Parallel() + + t.Run("Set KMS config in store", func(t *testing.T) { + t.Parallel() + store, ctx := createCtxAndConfigStoreForTest() + + testUUID := uuid.New() + + kmsConfig := model.KMSConfig{ + ID: testUUID, + Name: "test", + IntercomBind: "1337", + QuantumPushAddrBind: "4242", + } + + err := store.SetKMSConfig(ctx, kmsConfig) + require.NoError(t, err) + assert.Equal(t, kmsConfig, store.kmsConfig) + }) +} -- GitLab