-
Notifications
You must be signed in to change notification settings - Fork 8
/
hydration.go
141 lines (116 loc) · 3.69 KB
/
hydration.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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
// Copyright 2022 Namespace Labs Inc; All rights reserved.
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
package cmd
import (
"context"
"github.com/spf13/cobra"
"namespacelabs.dev/foundation/internal/cli/fncobra"
"namespacelabs.dev/foundation/internal/cli/fncobra/planningargs"
"namespacelabs.dev/foundation/internal/fnerrors"
"namespacelabs.dev/foundation/internal/planning"
"namespacelabs.dev/foundation/internal/planning/config"
"namespacelabs.dev/foundation/internal/planning/eval"
"namespacelabs.dev/foundation/internal/runtime"
"namespacelabs.dev/foundation/schema"
"namespacelabs.dev/foundation/std/cfg"
)
type hydrateParser struct {
resultOut *hydrateResult
env *cfg.Context
servers *planningargs.Servers
rehydrateOnly bool
rehydrate bool
}
type hydrateOpts struct {
// If false, allows controlling whether to rehydrate via the "rehydrate" flag.
rehydrateOnly bool
// Default value of the flag.
rehydrate bool
}
type hydrateResult struct {
Env cfg.Context
Stack *schema.Stack
Focus []schema.PackageName
Ingress []*schema.IngressFragment
Rehydrated *config.Rehydrated
}
func parseHydration(resultOut *hydrateResult, env *cfg.Context, servers *planningargs.Servers, opts *hydrateOpts) *hydrateParser {
return &hydrateParser{
resultOut: resultOut,
env: env,
servers: servers,
rehydrate: opts.rehydrate,
rehydrateOnly: opts.rehydrateOnly,
}
}
// Initializes parseHydration() with its dependencies.
func parseHydrationWithDeps(resultOut *hydrateResult, locationsOpts *fncobra.ParseLocationsOpts, opts *hydrateOpts) []fncobra.ArgsParser {
var (
env cfg.Context
locs fncobra.Locations
servers planningargs.Servers
)
return []fncobra.ArgsParser{
fncobra.ParseEnv(&env),
fncobra.ParseLocations(&locs, &env, *locationsOpts),
planningargs.ParseServers(&servers, &env, &locs),
parseHydration(resultOut, &env, &servers, opts),
}
}
func (h *hydrateParser) AddFlags(cmd *cobra.Command) {
if !h.rehydrateOnly {
cmd.Flags().BoolVar(&h.rehydrate, "rehydrate", h.rehydrate, "If set to false, compute stack at head, rather than loading the deployed configuration.")
}
}
func (h *hydrateParser) Parse(ctx context.Context, args []string) error {
if h.resultOut == nil {
return fnerrors.InternalError("resultOut must be set")
}
if h.servers == nil {
return fnerrors.InternalError("servers must be set")
}
servers := h.servers.Servers
for _, srv := range servers {
h.resultOut.Focus = append(h.resultOut.Focus, srv.PackageName())
}
h.resultOut.Env = *h.env
if h.rehydrate || h.rehydrateOnly {
if len(servers) != 1 {
return fnerrors.New("--rehydrate only supports a single server")
}
cluster, err := runtime.NamespaceFor(ctx, *h.env)
if err != nil {
return err
}
buildID, err := cluster.DeployedConfigImageID(ctx, servers[0].Proto())
if err != nil {
return err
}
rehydrated, err := config.Rehydrate(ctx, servers[0], buildID)
if err != nil {
return err
}
h.resultOut.Stack = rehydrated.Stack
h.resultOut.Ingress = rehydrated.IngressFragments
h.resultOut.Rehydrated = rehydrated
} else {
cluster, err := runtime.PlannerFor(ctx, *h.env)
if err != nil {
return err
}
stack, err := planning.ComputeStack(ctx, servers, planning.ProvisionOpts{Planner: cluster, PortRange: eval.DefaultPortRange()})
if err != nil {
return err
}
h.resultOut.Stack = stack.Proto()
for _, entry := range stack.Proto().Entry {
deferred, err := runtime.ComputeIngress(ctx, *h.env, cluster, entry, stack.Endpoints)
if err != nil {
return err
}
h.resultOut.Ingress = deferred
}
}
return nil
}