Kubernetes Operator for Tangled Spindles

remove upstreamed impl from doc

evan.jarrett.net e61d53ee 1bbed1df

verified
-90
-90
TANGLED.md
··· 4 4 5 5 ## Critical Issues 6 6 7 - ### 1. Spindle Server Constructor Not Exported 8 - 9 - **Current State:** 10 - - `spindle.Run()` creates an unexported `Spindle` struct internally 11 - - Hardcodes `nixery.New()` engine initialization 12 - - Blocks on `http.ListenAndServe()` at the end 13 - - No way to inject custom engines or access spindle components 14 - 15 - **Proposed Solution:** 16 - ```go 17 - // spindle/server.go 18 - 19 - // Spindle should be exported 20 - type Spindle struct { 21 - jc *jetstream.JetstreamClient 22 - db *db.DB 23 - e *rbac.Enforcer 24 - l *slog.Logger 25 - n *notifier.Notifier 26 - engs map[string]models.Engine 27 - jq *queue.Queue 28 - cfg *config.Config 29 - ks *eventconsumer.Consumer 30 - res *idresolver.Resolver 31 - vault secrets.Manager 32 - } 33 - 34 - // New creates a spindle server with custom engines 35 - func New(ctx context.Context, cfg *config.Config, engines map[string]models.Engine) (*Spindle, error) { 36 - // All the initialization logic currently in Run() 37 - // But accept engines as parameter instead of hardcoding nixery 38 - 39 - return &Spindle{...}, nil 40 - } 41 - 42 - // Start starts the HTTP server (blocking) 43 - func (s *Spindle) Start(ctx context.Context) error { 44 - s.l.Info("starting spindle server", "address", s.cfg.Server.ListenAddr) 45 - return http.ListenAndServe(s.cfg.Server.ListenAddr, s.Router()) 46 - } 47 - 48 - // Run is a convenience function for standard spindle operation 49 - func Run(ctx context.Context) error { 50 - cfg, err := config.Load(ctx) 51 - if err != nil { 52 - return err 53 - } 54 - 55 - // Create default engines (nixery) 56 - nixeryEng, err := nixery.New(ctx, cfg) 57 - if err != nil { 58 - return err 59 - } 60 - 61 - s, err := New(ctx, cfg, map[string]models.Engine{ 62 - "nixery": nixeryEng, 63 - }) 64 - if err != nil { 65 - return err 66 - } 67 - 68 - return s.Start(ctx) 69 - } 70 - ``` 71 - 72 - **Benefits:** 73 - - Custom engine implementations (KubernetesEngine, DockerEngine, etc.) 74 - - Embedding spindle in other applications 75 - - Testing with mock engines 76 - - Multiple engines in single spindle instance 77 - 78 - **Use Case in Loom:** 79 - ```go 80 - // Loom can now use spindle properly 81 - s, err := spindle.New(ctx, cfg, map[string]models.Engine{ 82 - "kubernetes": kubeEngine, 83 - }) 84 - 85 - // Start in goroutine 86 - go s.Start(ctx) 87 - 88 - // Access components for controller 89 - controller := &SpindleSetReconciler{ 90 - DB: s.DB(), 91 - Queue: s.Queue(), 92 - Engines: s.Engines(), 93 - } 94 - ``` 95 - 96 - --- 97 7 98 8 ## Helpful Interface Additions 99 9