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 := GetRemoteClient()
29 if isRemote {
30 return &controlPlaneHandle{plane: NewRemoteControlPlane(client), isRemote: true}, nil
31 }
32
33 return resolveLocalControlPlane(configPath)
34}
35
36func newRemoteControlPlaneHandle(target *remote.ResolvedRemote) *controlPlaneHandle {
37 client := remote.NewClient(target.URL, remoteClientOptions(target.Token, target.InsecureTLS)...)
38 return &controlPlaneHandle{plane: NewRemoteControlPlane(client), isRemote: true}
39}
40
41func resolveControlPlaneForRouteDomain(ctx context.Context, routeDomain string) (*controlPlaneHandle, error) {
42 return resolveControlPlaneWithInference(ctx, func(ctx context.Context) (*remote.ResolvedRemote, error) {
43 return inferRemoteForRouteDomain(ctx, routeDomain)
44 })
45}
46
47func resolveControlPlaneForAttachmentTarget(ctx context.Context, target string) (*controlPlaneHandle, error) {
48 return resolveControlPlaneWithInference(ctx, func(ctx context.Context) (*remote.ResolvedRemote, error) {
49 return inferRemoteForAttachmentTarget(ctx, target)
50 })
51}
52
53func resolveControlPlaneForRepository(ctx context.Context, repository string) (*controlPlaneHandle, error) {
54 return resolveControlPlaneWithInference(ctx, func(ctx context.Context) (*remote.ResolvedRemote, error) {
55 return inferRemoteForRepository(ctx, repository)
56 })
57}
58
59func resolveControlPlaneWithInference(ctx context.Context, infer func(context.Context) (*remote.ResolvedRemote, error)) (*controlPlaneHandle, error) {
60 resolved, err := infer(ctx)
61 if err != nil {
62 return nil, err
63 }
64 if resolved != nil {
65 return newRemoteControlPlaneHandle(resolved), nil
66 }
67 return resolveControlPlane(configPath)
68}
69
70func resolveLocalControlPlane(configPath string) (*controlPlaneHandle, error) {
71 kernel, err := app.NewKernelQuiet(configPath)
72 if err != nil {
73 return nil, fmt.Errorf("failed to initialize local control plane: %w", err)
74 }
75
76 return &controlPlaneHandle{
77 plane: NewLocalControlPlane(kernel),
78 closeFn: kernel.Close,
79 }, nil
80}