Skip to content

Commit c20e84f

Browse files
committed
context logger
1 parent ce516fd commit c20e84f

File tree

4 files changed

+42
-26
lines changed

4 files changed

+42
-26
lines changed

lib/ingress/config.go

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
package ingress
22

33
import (
4+
"context"
45
"fmt"
5-
"log/slog"
66
"os"
77
"path/filepath"
88
"strings"
99

10+
"github.com/onkernel/hypeman/lib/logger"
1011
"github.com/onkernel/hypeman/lib/paths"
1112
"gopkg.in/yaml.v3"
1213
)
@@ -31,14 +32,14 @@ func NewEnvoyConfigGenerator(p *paths.Paths, listenAddress string, adminAddress
3132

3233
// GenerateConfig generates Envoy configuration from the given ingresses and their resolved IP addresses.
3334
// The ipResolver function takes an instance name/ID and returns (ip, error).
34-
func (g *EnvoyConfigGenerator) GenerateConfig(ingresses []Ingress, ipResolver func(instance string) (string, error)) ([]byte, error) {
35-
config := g.buildConfig(ingresses, ipResolver)
35+
func (g *EnvoyConfigGenerator) GenerateConfig(ctx context.Context, ingresses []Ingress, ipResolver func(instance string) (string, error)) ([]byte, error) {
36+
config := g.buildConfig(ctx, ingresses, ipResolver)
3637
return yaml.Marshal(config)
3738
}
3839

3940
// WriteConfig generates and writes the Envoy configuration file.
40-
func (g *EnvoyConfigGenerator) WriteConfig(ingresses []Ingress, ipResolver func(instance string) (string, error)) error {
41-
data, err := g.GenerateConfig(ingresses, ipResolver)
41+
func (g *EnvoyConfigGenerator) WriteConfig(ctx context.Context, ingresses []Ingress, ipResolver func(instance string) (string, error)) error {
42+
data, err := g.GenerateConfig(ctx, ingresses, ipResolver)
4243
if err != nil {
4344
return fmt.Errorf("generate config: %w", err)
4445
}
@@ -58,7 +59,7 @@ func (g *EnvoyConfigGenerator) WriteConfig(ingresses []Ingress, ipResolver func(
5859
}
5960

6061
// buildConfig builds the Envoy configuration structure.
61-
func (g *EnvoyConfigGenerator) buildConfig(ingresses []Ingress, ipResolver func(instance string) (string, error)) map[string]interface{} {
62+
func (g *EnvoyConfigGenerator) buildConfig(ctx context.Context, ingresses []Ingress, ipResolver func(instance string) (string, error)) map[string]interface{} {
6263
config := map[string]interface{}{
6364
"admin": map[string]interface{}{
6465
"address": map[string]interface{}{
@@ -69,22 +70,22 @@ func (g *EnvoyConfigGenerator) buildConfig(ingresses []Ingress, ipResolver func(
6970
},
7071
},
7172
"static_resources": map[string]interface{}{
72-
"listeners": g.buildListeners(ingresses, ipResolver),
73-
"clusters": g.buildClusters(ingresses, ipResolver),
73+
"listeners": g.buildListeners(ctx, ingresses, ipResolver),
74+
"clusters": g.buildClusters(ctx, ingresses, ipResolver),
7475
},
7576
}
7677

7778
return config
7879
}
7980

8081
// buildListeners builds the listeners configuration - one per unique port.
81-
func (g *EnvoyConfigGenerator) buildListeners(ingresses []Ingress, ipResolver func(instance string) (string, error)) []interface{} {
82+
func (g *EnvoyConfigGenerator) buildListeners(ctx context.Context, ingresses []Ingress, ipResolver func(instance string) (string, error)) []interface{} {
8283
if len(ingresses) == 0 {
8384
return []interface{}{}
8485
}
8586

8687
// Group rules by port
87-
portToFilterChains := g.buildFilterChainsByPort(ingresses, ipResolver)
88+
portToFilterChains := g.buildFilterChainsByPort(ctx, ingresses, ipResolver)
8889
if len(portToFilterChains) == 0 {
8990
return []interface{}{}
9091
}
@@ -111,7 +112,9 @@ func (g *EnvoyConfigGenerator) buildListeners(ingresses []Ingress, ipResolver fu
111112
// buildFilterChainsByPort builds filter chains grouped by port for hostname-based routing.
112113
// For plain HTTP, we use virtual hosts with domain matching (Host header) instead of
113114
// filter_chain_match with server_names (which only works for TLS/SNI).
114-
func (g *EnvoyConfigGenerator) buildFilterChainsByPort(ingresses []Ingress, ipResolver func(instance string) (string, error)) map[int][]interface{} {
115+
func (g *EnvoyConfigGenerator) buildFilterChainsByPort(ctx context.Context, ingresses []Ingress, ipResolver func(instance string) (string, error)) map[int][]interface{} {
116+
log := logger.FromContext(ctx)
117+
115118
// Group virtual hosts by port
116119
portToVirtualHosts := make(map[int][]interface{})
117120

@@ -120,7 +123,7 @@ func (g *EnvoyConfigGenerator) buildFilterChainsByPort(ingresses []Ingress, ipRe
120123
// Resolve instance IP - skip rules where we can't resolve
121124
_, err := ipResolver(rule.Target.Instance)
122125
if err != nil {
123-
slog.Warn("skipping ingress rule: cannot resolve instance IP",
126+
log.WarnContext(ctx, "skipping ingress rule: cannot resolve instance IP",
124127
"ingress_id", ingress.ID,
125128
"ingress_name", ingress.Name,
126129
"hostname", rule.Match.Hostname,
@@ -212,7 +215,9 @@ func (g *EnvoyConfigGenerator) buildFilterChainsByPort(ingresses []Ingress, ipRe
212215
}
213216

214217
// buildClusters builds the clusters configuration.
215-
func (g *EnvoyConfigGenerator) buildClusters(ingresses []Ingress, ipResolver func(instance string) (string, error)) []interface{} {
218+
func (g *EnvoyConfigGenerator) buildClusters(ctx context.Context, ingresses []Ingress, ipResolver func(instance string) (string, error)) []interface{} {
219+
log := logger.FromContext(ctx)
220+
216221
var clusters []interface{}
217222
seen := make(map[string]bool)
218223

@@ -228,7 +233,7 @@ func (g *EnvoyConfigGenerator) buildClusters(ingresses []Ingress, ipResolver fun
228233
ip, err := ipResolver(rule.Target.Instance)
229234
if err != nil {
230235
// Skip clusters where we can't resolve the instance
231-
slog.Warn("skipping cluster: cannot resolve instance IP",
236+
log.WarnContext(ctx, "skipping cluster: cannot resolve instance IP",
232237
"ingress_id", ingress.ID,
233238
"instance", rule.Target.Instance,
234239
"error", err)

lib/ingress/config_test.go

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package ingress
22

33
import (
4+
"context"
45
"os"
56
"strings"
67
"testing"
@@ -36,12 +37,13 @@ func TestGenerateConfig_EmptyIngresses(t *testing.T) {
3637
generator, _, cleanup := setupTestGenerator(t)
3738
defer cleanup()
3839

40+
ctx := context.Background()
3941
ingresses := []Ingress{}
4042
ipResolver := func(instance string) (string, error) {
4143
return "10.100.0.10", nil
4244
}
4345

44-
data, err := generator.GenerateConfig(ingresses, ipResolver)
46+
data, err := generator.GenerateConfig(ctx, ingresses, ipResolver)
4547
require.NoError(t, err)
4648

4749
// Parse YAML to verify structure
@@ -85,14 +87,15 @@ func TestGenerateConfig_SingleIngress(t *testing.T) {
8587
},
8688
}
8789

90+
ctx := context.Background()
8891
ipResolver := func(instance string) (string, error) {
8992
if instance == "my-api" {
9093
return "10.100.0.10", nil
9194
}
9295
return "", ErrInstanceNotFound
9396
}
9497

95-
data, err := generator.GenerateConfig(ingresses, ipResolver)
98+
data, err := generator.GenerateConfig(ctx, ingresses, ipResolver)
9699
require.NoError(t, err)
97100

98101
configStr := string(data)
@@ -108,6 +111,7 @@ func TestGenerateConfig_MultipleRules(t *testing.T) {
108111
generator, _, cleanup := setupTestGenerator(t)
109112
defer cleanup()
110113

114+
ctx := context.Background()
111115
ingresses := []Ingress{
112116
{
113117
ID: "ing-123",
@@ -135,7 +139,7 @@ func TestGenerateConfig_MultipleRules(t *testing.T) {
135139
return "", ErrInstanceNotFound
136140
}
137141

138-
data, err := generator.GenerateConfig(ingresses, ipResolver)
142+
data, err := generator.GenerateConfig(ctx, ingresses, ipResolver)
139143
require.NoError(t, err)
140144

141145
configStr := string(data)
@@ -151,6 +155,7 @@ func TestGenerateConfig_MultipleIngresses(t *testing.T) {
151155
generator, _, cleanup := setupTestGenerator(t)
152156
defer cleanup()
153157

158+
ctx := context.Background()
154159
ingresses := []Ingress{
155160
{
156161
ID: "ing-1",
@@ -174,7 +179,7 @@ func TestGenerateConfig_MultipleIngresses(t *testing.T) {
174179
return "", ErrInstanceNotFound
175180
}
176181

177-
data, err := generator.GenerateConfig(ingresses, ipResolver)
182+
data, err := generator.GenerateConfig(ctx, ingresses, ipResolver)
178183
require.NoError(t, err)
179184

180185
configStr := string(data)
@@ -190,6 +195,7 @@ func TestGenerateConfig_MultiplePorts(t *testing.T) {
190195
generator, _, cleanup := setupTestGenerator(t)
191196
defer cleanup()
192197

198+
ctx := context.Background()
193199
ingresses := []Ingress{
194200
{
195201
ID: "ing-1",
@@ -226,7 +232,7 @@ func TestGenerateConfig_MultiplePorts(t *testing.T) {
226232
return "", ErrInstanceNotFound
227233
}
228234

229-
data, err := generator.GenerateConfig(ingresses, ipResolver)
235+
data, err := generator.GenerateConfig(ctx, ingresses, ipResolver)
230236
require.NoError(t, err)
231237

232238
configStr := string(data)
@@ -251,6 +257,7 @@ func TestGenerateConfig_DefaultPort(t *testing.T) {
251257
generator, _, cleanup := setupTestGenerator(t)
252258
defer cleanup()
253259

260+
ctx := context.Background()
254261
// Test that Port=0 defaults to 80
255262
ingresses := []Ingress{
256263
{
@@ -266,7 +273,7 @@ func TestGenerateConfig_DefaultPort(t *testing.T) {
266273
return "10.100.0.10", nil
267274
}
268275

269-
data, err := generator.GenerateConfig(ingresses, ipResolver)
276+
data, err := generator.GenerateConfig(ctx, ingresses, ipResolver)
270277
require.NoError(t, err)
271278

272279
configStr := string(data)
@@ -280,6 +287,7 @@ func TestGenerateConfig_SkipsUnresolvedInstances(t *testing.T) {
280287
generator, _, cleanup := setupTestGenerator(t)
281288
defer cleanup()
282289

290+
ctx := context.Background()
283291
ingresses := []Ingress{
284292
{
285293
ID: "ing-123",
@@ -304,7 +312,7 @@ func TestGenerateConfig_SkipsUnresolvedInstances(t *testing.T) {
304312
return "", ErrInstanceNotFound
305313
}
306314

307-
data, err := generator.GenerateConfig(ingresses, ipResolver)
315+
data, err := generator.GenerateConfig(ctx, ingresses, ipResolver)
308316
require.NoError(t, err)
309317

310318
configStr := string(data)
@@ -321,6 +329,7 @@ func TestWriteConfig(t *testing.T) {
321329
generator, p, cleanup := setupTestGenerator(t)
322330
defer cleanup()
323331

332+
ctx := context.Background()
324333
ingresses := []Ingress{
325334
{
326335
ID: "ing-123",
@@ -333,7 +342,7 @@ func TestWriteConfig(t *testing.T) {
333342
return "10.100.0.10", nil
334343
}
335344

336-
err := generator.WriteConfig(ingresses, ipResolver)
345+
err := generator.WriteConfig(ctx, ingresses, ipResolver)
337346
require.NoError(t, err)
338347

339348
// Verify file was written
@@ -367,6 +376,7 @@ func TestConfigIsValidYAML(t *testing.T) {
367376
generator, _, cleanup := setupTestGenerator(t)
368377
defer cleanup()
369378

379+
ctx := context.Background()
370380
ingresses := []Ingress{
371381
{
372382
ID: "ing-123",
@@ -384,7 +394,7 @@ func TestConfigIsValidYAML(t *testing.T) {
384394
return "10.100.0.10", nil
385395
}
386396

387-
data, err := generator.GenerateConfig(ingresses, ipResolver)
397+
data, err := generator.GenerateConfig(ctx, ingresses, ipResolver)
388398
require.NoError(t, err)
389399

390400
// Verify it's valid YAML by parsing it

lib/ingress/daemon.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import (
44
"context"
55
"fmt"
66
"hash/fnv"
7-
"log/slog"
87
"net/http"
98
"os"
109
"os/exec"
@@ -14,6 +13,7 @@ import (
1413
"syscall"
1514
"time"
1615

16+
"github.com/onkernel/hypeman/lib/logger"
1717
"github.com/onkernel/hypeman/lib/paths"
1818
)
1919

@@ -139,7 +139,8 @@ func (d *EnvoyDaemon) startEnvoy(ctx context.Context, epoch int) (int, error) {
139139
pidPath := d.paths.EnvoyPIDFile()
140140
if err := os.WriteFile(pidPath, []byte(strconv.Itoa(pid)), 0644); err != nil {
141141
// Non-fatal, log but continue
142-
slog.Warn("failed to write PID file", "error", err)
142+
log := logger.FromContext(ctx)
143+
log.WarnContext(ctx, "failed to write PID file", "error", err)
143144
}
144145

145146
// Save epoch

lib/ingress/manager.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -317,7 +317,7 @@ func (m *manager) regenerateConfig(ctx context.Context, ingresses []Ingress) err
317317
return m.instanceResolver.ResolveInstanceIP(ctx, instance)
318318
}
319319

320-
return m.configGenerator.WriteConfig(ingresses, ipResolver)
320+
return m.configGenerator.WriteConfig(ctx, ingresses, ipResolver)
321321
}
322322

323323
// storedToIngress converts a storedIngress to an Ingress.

0 commit comments

Comments
 (0)