1package cli
2
3import (
4 "context"
5 "fmt"
6
7 "github.com/bnema/gordon/internal/adapters/in/cli/remote"
8 "github.com/bnema/gordon/internal/app"
9)
10
11type controlPlaneHandle struct {
12 plane ControlPlane
13 isRemote bool
14 closeFn func() error
15}
16
17func (h *controlPlaneHandle) close() {
18 if h == nil || h.closeFn == nil {
19 return
20 }
21 if err := h.closeFn(); err != nil {
22 log := cliLogger()
23 log.Warn().Err(err).Msg("failed to close control-plane resources")
24 }
25}
26
27func resolveControlPlane(configPath string) (*controlPlaneHandle, error) {
28 client, isRemote, err := GetRemoteClient()
29 if err != nil {
30 return nil, err
31 }
32 if isRemote {
33 return &controlPlaneHandle{plane: NewRemoteControlPlane(client), isRemote: true}, nil
34 }
35
36 return resolveLocalControlPlane(configPath)
37}
38
39func newRemoteControlPlaneHandle(target *remote.ResolvedRemote) *controlPlaneHandle {
40 client := remote.NewClient(target.URL, remoteClientOptions(target.Token, target.InsecureTLS)...)
41 return &controlPlaneHandle{plane: NewRemoteControlPlane(client), isRemote: true}
42}
43
44func resolveControlPlaneForRouteDomain(ctx context.Context, routeDomain string) (*controlPlaneHandle, error) {
45 return resolveControlPlaneWithInference(ctx, func(ctx context.Context) (*remote.ResolvedRemote, error) {
46 return inferRemoteForRouteDomain(ctx, routeDomain)
47 })
48}
49
50func resolveControlPlaneForRouteCleanupDomain(ctx context.Context, routeDomain string) (*controlPlaneHandle, error) {
51 return resolveControlPlaneWithInference(ctx, func(ctx context.Context) (*remote.ResolvedRemote, error) {
52 return inferRemoteForRouteCleanupDomain(ctx, routeDomain)
53 })
54}
55
56func resolveControlPlaneForAttachmentTarget(ctx context.Context, target string) (*controlPlaneHandle, error) {
57 return resolveControlPlaneWithInference(ctx, func(ctx context.Context) (*remote.ResolvedRemote, error) {
58 return inferRemoteForAttachmentTarget(ctx, target)
59 })
60}
61
62func resolveControlPlaneForRepository(ctx context.Context, repository string) (*controlPlaneHandle, error) {
63 return resolveControlPlaneWithInference(ctx, func(ctx context.Context) (*remote.ResolvedRemote, error) {
64 return inferRemoteForRepository(ctx, repository)
65 })
66}
67
68func resolveControlPlaneWithInference(ctx context.Context, infer func(context.Context) (*remote.ResolvedRemote, error)) (*controlPlaneHandle, error) {
69 resolved, err := infer(ctx)
70 if err != nil {
71 return nil, err
72 }
73 if resolved != nil {
74 return newRemoteControlPlaneHandle(resolved), nil
75 }
76 return resolveControlPlane(configPath)
77}
78
79func resolveLocalControlPlane(configPath string) (*controlPlaneHandle, error) {
80 kernel, err := app.NewKernelQuiet(configPath)
81 if err != nil {
82 return nil, fmt.Errorf("failed to initialize local control plane: %w", err)
83 }
84
85 return &controlPlaneHandle{
86 plane: NewLocalControlPlane(kernel),
87 closeFn: kernel.Close,
88 }, nil
89}