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