/
remote.go
80 lines (70 loc) · 2.2 KB
/
remote.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
package appconfig
import (
"context"
"fmt"
fly "github.com/superfly/fly-go"
"github.com/superfly/fly-go/flaps"
"github.com/superfly/flyctl/gql"
"github.com/superfly/flyctl/internal/machine"
"github.com/superfly/flyctl/iostreams"
)
func FromRemoteApp(ctx context.Context, appName string) (*Config, error) {
apiClient := fly.ClientFromContext(ctx)
cfg, err := getAppV2ConfigFromReleases(ctx, apiClient, appName)
if cfg == nil {
cfg, err = getAppV2ConfigFromMachines(ctx, appName)
}
if err != nil {
return nil, err
}
if err := cfg.SetMachinesPlatform(); err != nil {
return nil, err
}
cfg.AppName = appName
return cfg, nil
}
func getAppV2ConfigFromMachines(ctx context.Context, appName string) (*Config, error) {
flapsClient := flaps.FromContext(ctx)
io := iostreams.FromContext(ctx)
activeMachines, err := machine.ListActive(ctx)
if err != nil {
return nil, fmt.Errorf("error listing active machines for %s app: %w", appName, err)
}
machineSet := machine.NewMachineSet(flapsClient, io, activeMachines)
appConfig, warnings, err := FromAppAndMachineSet(ctx, appName, machineSet)
if err != nil {
return nil, fmt.Errorf("failed to grab app config from existing machines, error: %w", err)
}
if warnings != "" {
fmt.Fprintf(io.ErrOut, "WARNINGS:\n%s", warnings)
}
return appConfig, nil
}
func getAppV2ConfigFromReleases(ctx context.Context, apiClient *fly.Client, appName string) (*Config, error) {
_ = `# @genqlient
query FlyctlConfigCurrentRelease($appName: String!) {
app(name:$appName) {
currentReleaseUnprocessed {
configDefinition
}
}
}
`
resp, err := gql.FlyctlConfigCurrentRelease(ctx, apiClient.GenqClient, appName)
if err != nil {
return nil, err
}
configDefinition := resp.App.CurrentReleaseUnprocessed.ConfigDefinition
if configDefinition == nil {
return nil, nil
}
configMapDefinition, ok := configDefinition.(map[string]any)
if !ok {
return nil, fmt.Errorf("likely a bug, could not convert config definition of type %T to api map[string]any", configDefinition)
}
appConfig, err := FromDefinition(fly.DefinitionPtr(configMapDefinition))
if err != nil {
return nil, fmt.Errorf("error creating appv2 Config from api definition: %w", err)
}
return appConfig, err
}