Checkpoint: auth, engine, seal, server, grpc updates
Co-authored-by: Junie <junie@jetbrains.com>
This commit is contained in:
@@ -7,6 +7,7 @@ import (
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"log/slog"
|
||||
"strings"
|
||||
"sync"
|
||||
|
||||
@@ -76,18 +77,20 @@ type Mount struct {
|
||||
|
||||
// Registry manages mounted engine instances.
|
||||
type Registry struct {
|
||||
mu sync.RWMutex
|
||||
mounts map[string]*Mount
|
||||
mu sync.RWMutex
|
||||
mounts map[string]*Mount
|
||||
factories map[EngineType]Factory
|
||||
barrier barrier.Barrier
|
||||
barrier barrier.Barrier
|
||||
logger *slog.Logger
|
||||
}
|
||||
|
||||
// NewRegistry creates a new engine registry.
|
||||
func NewRegistry(b barrier.Barrier) *Registry {
|
||||
func NewRegistry(b barrier.Barrier, logger *slog.Logger) *Registry {
|
||||
return &Registry{
|
||||
mounts: make(map[string]*Mount),
|
||||
factories: make(map[EngineType]Factory),
|
||||
barrier: b,
|
||||
logger: logger,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -95,6 +98,7 @@ func NewRegistry(b barrier.Barrier) *Registry {
|
||||
func (r *Registry) RegisterFactory(t EngineType, f Factory) {
|
||||
r.mu.Lock()
|
||||
defer r.mu.Unlock()
|
||||
r.logger.Debug("registering engine factory", "type", t)
|
||||
r.factories[t] = f
|
||||
}
|
||||
|
||||
@@ -120,6 +124,7 @@ func (r *Registry) Mount(ctx context.Context, name string, engineType EngineType
|
||||
return fmt.Errorf("%w: %s", ErrUnknownType, engineType)
|
||||
}
|
||||
|
||||
r.logger.Debug("mounting engine", "name", name, "type", engineType)
|
||||
eng := factory()
|
||||
mountPath := fmt.Sprintf("engine/%s/%s/", engineType, name)
|
||||
|
||||
@@ -142,6 +147,7 @@ func (r *Registry) Mount(ctx context.Context, name string, engineType EngineType
|
||||
MountPath: mountPath,
|
||||
Engine: eng,
|
||||
}
|
||||
r.logger.Debug("engine mounted", "name", name, "type", engineType, "mount_path", mountPath)
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -179,6 +185,7 @@ func (r *Registry) Unmount(ctx context.Context, name string) error {
|
||||
return ErrMountNotFound
|
||||
}
|
||||
|
||||
r.logger.Debug("unmounting engine", "name", name, "type", mount.Type)
|
||||
if err := mount.Engine.Seal(); err != nil {
|
||||
return fmt.Errorf("engine: seal %q: %w", name, err)
|
||||
}
|
||||
@@ -189,6 +196,7 @@ func (r *Registry) Unmount(ctx context.Context, name string) error {
|
||||
}
|
||||
|
||||
delete(r.mounts, name)
|
||||
r.logger.Debug("engine unmounted", "name", name)
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -231,6 +239,7 @@ func (r *Registry) UnsealAll(ctx context.Context) error {
|
||||
continue // already loaded
|
||||
}
|
||||
|
||||
r.logger.Debug("discovered pre-migration engine mount", "name", name, "type", engineType)
|
||||
eng := factory()
|
||||
mountPath := fmt.Sprintf("engine/%s/%s/", engineType, name)
|
||||
if err := eng.Unseal(ctx, r.barrier, mountPath); err != nil {
|
||||
@@ -280,6 +289,7 @@ func (r *Registry) loadFromMetadata(ctx context.Context) error {
|
||||
return fmt.Errorf("%w: %s (mount %q)", ErrUnknownType, meta.Type, meta.Name)
|
||||
}
|
||||
|
||||
r.logger.Debug("unsealing engine from metadata", "name", meta.Name, "type", meta.Type)
|
||||
eng := factory()
|
||||
mountPath := fmt.Sprintf("engine/%s/%s/", meta.Type, meta.Name)
|
||||
if err := eng.Unseal(ctx, r.barrier, mountPath); err != nil {
|
||||
@@ -323,6 +333,7 @@ func (r *Registry) HandleRequest(ctx context.Context, mountName string, req *Req
|
||||
return nil, ErrMountNotFound
|
||||
}
|
||||
|
||||
r.logger.Debug("routing engine request", "mount", mountName, "operation", req.Operation, "path", req.Path)
|
||||
return mount.Engine.HandleRequest(ctx, req)
|
||||
}
|
||||
|
||||
@@ -331,6 +342,7 @@ func (r *Registry) SealAll() error {
|
||||
r.mu.Lock()
|
||||
defer r.mu.Unlock()
|
||||
|
||||
r.logger.Debug("sealing all engines", "count", len(r.mounts))
|
||||
for name, mount := range r.mounts {
|
||||
if err := mount.Engine.Seal(); err != nil {
|
||||
return fmt.Errorf("engine: seal %q: %w", name, err)
|
||||
|
||||
@@ -2,6 +2,7 @@ package engine
|
||||
|
||||
import (
|
||||
"context"
|
||||
"log/slog"
|
||||
"testing"
|
||||
|
||||
"git.wntrmute.dev/kyle/metacrypt/internal/barrier"
|
||||
@@ -39,7 +40,7 @@ func (m *mockBarrier) Delete(_ context.Context, _ string) error { retu
|
||||
func (m *mockBarrier) List(_ context.Context, _ string) ([]string, error) { return nil, nil }
|
||||
|
||||
func TestRegistryMountUnmount(t *testing.T) {
|
||||
reg := NewRegistry(&mockBarrier{})
|
||||
reg := NewRegistry(&mockBarrier{}, slog.Default())
|
||||
reg.RegisterFactory(EngineTypeTransit, func() Engine {
|
||||
return &mockEngine{engineType: EngineTypeTransit}
|
||||
})
|
||||
@@ -73,14 +74,14 @@ func TestRegistryMountUnmount(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestRegistryUnmountNotFound(t *testing.T) {
|
||||
reg := NewRegistry(&mockBarrier{})
|
||||
reg := NewRegistry(&mockBarrier{}, slog.Default())
|
||||
if err := reg.Unmount(context.Background(), "nonexistent"); err != ErrMountNotFound {
|
||||
t.Fatalf("expected ErrMountNotFound, got: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestRegistryUnknownType(t *testing.T) {
|
||||
reg := NewRegistry(&mockBarrier{})
|
||||
reg := NewRegistry(&mockBarrier{}, slog.Default())
|
||||
err := reg.Mount(context.Background(), "test", EngineTypeTransit, nil)
|
||||
if err == nil {
|
||||
t.Fatal("expected error for unknown engine type")
|
||||
@@ -88,7 +89,7 @@ func TestRegistryUnknownType(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestRegistryHandleRequest(t *testing.T) {
|
||||
reg := NewRegistry(&mockBarrier{})
|
||||
reg := NewRegistry(&mockBarrier{}, slog.Default())
|
||||
reg.RegisterFactory(EngineTypeTransit, func() Engine {
|
||||
return &mockEngine{engineType: EngineTypeTransit}
|
||||
})
|
||||
@@ -111,7 +112,7 @@ func TestRegistryHandleRequest(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestRegistrySealAll(t *testing.T) {
|
||||
reg := NewRegistry(&mockBarrier{})
|
||||
reg := NewRegistry(&mockBarrier{}, slog.Default())
|
||||
reg.RegisterFactory(EngineTypeTransit, func() Engine {
|
||||
return &mockEngine{engineType: EngineTypeTransit}
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user