v2.31.0-dev22 8d342c4

traffic.go RawHistoryFolder

1package app
2
3import (
4	"context"
5	"fmt"
6
7	trafficadapter "github.com/bnema/gordon/internal/adapters/in/traffic"
8	"github.com/bnema/gordon/internal/boundaries/in"
9	"github.com/bnema/gordon/internal/domain"
10	servicecfg "github.com/bnema/gordon/internal/usecase/services"
11	trafficbuilder "github.com/bnema/gordon/internal/usecase/traffic"
12)
13
14func applyTrafficRuntimeConfig(ctx context.Context, manager *trafficadapter.Manager, cfg Config, configSvc in.ConfigService) error {
15	if manager == nil || configSvc == nil {
16		return nil
17	}
18	standaloneServices, err := servicecfg.ToDomain(cfg.Services)
19	if err != nil {
20		return fmt.Errorf("convert standalone service config: %w", err)
21	}
22	graph, err := trafficbuilder.Build(trafficbuilder.Input{
23		EntryPoints:     cfg.EntryPoints,
24		Traffic:         cfg.Traffic,
25		Routes:          configSvc.GetRoutes(ctx),
26		ExternalRoutes:  configSvc.GetExternalRoutes(),
27		NetworkServices: cfg.NetworkServices,
28		Services:        standaloneServices,
29	})
30	if err != nil {
31		return fmt.Errorf("build traffic graph: %w", err)
32	}
33	owned, err := trafficRuntimeGraph(graph)
34	if err != nil {
35		return fmt.Errorf("filter traffic graph for runtime ownership: %w", err)
36	}
37	if err := manager.Apply(ctx, &owned); err != nil {
38		return fmt.Errorf("apply traffic graph: %w", err)
39	}
40	return nil
41}
42
43func trafficRuntimeGraph(graph domain.TrafficGraph) (domain.TrafficGraph, error) {
44	ownedEntryPoints := map[string]struct{}{}
45	filtered := domain.TrafficGraph{Options: graph.Options}
46	for _, entryPoint := range graph.EntryPoints {
47		if trafficManagerOwnsEntryPoint(entryPoint) {
48			filtered.EntryPoints = append(filtered.EntryPoints, entryPoint)
49			ownedEntryPoints[entryPoint.Name] = struct{}{}
50		}
51	}
52
53	usedServices := map[string]struct{}{}
54	for _, router := range graph.Routers {
55		if _, ok := ownedEntryPoints[router.EntryPoint]; !ok {
56			if trafficManagerRouterProtocol(router.Protocol) {
57				return domain.TrafficGraph{}, fmt.Errorf("traffic router %q targets entrypoint %q, which is not owned by the traffic manager", router.Name, router.EntryPoint)
58			}
59			continue
60		}
61		filtered.Routers = append(filtered.Routers, router)
62		usedServices[router.Service] = struct{}{}
63	}
64	for _, service := range graph.Services {
65		if _, ok := usedServices[service.Name]; ok {
66			filtered.Services = append(filtered.Services, service)
67		}
68	}
69	return filtered, nil
70}
71
72func trafficManagerRouterProtocol(protocol domain.RouterProtocol) bool {
73	switch protocol {
74	case domain.RouterProtocolTCP, domain.RouterProtocolUDP, domain.RouterProtocolTLSPassthrough:
75		return true
76	default:
77		return false
78	}
79}
80
81func trafficManagerOwnsEntryPoint(entryPoint domain.EntryPoint) bool {
82	switch entryPoint.Protocol {
83	case domain.EntryPointProtocolTLSMux, domain.EntryPointProtocolSmartTCP, domain.EntryPointProtocolTCP, domain.EntryPointProtocolUDP:
84		return true
85	default:
86		return false
87	}
88}

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 7

Tags 106

↑↓ moveenter openesc close