blob: a646425fe0c7b70c139c6d38916b2771f7d975e6 [file] [log] [blame]
Giorgi Lekveishvili7c427602024-01-04 00:13:55 +04001package installer
2
3import (
gio0eaf2712024-04-14 13:08:46 +04004 _ "embed"
gio3cdee592024-04-17 10:15:56 +04005 "net"
Giorgi Lekveishvili7c427602024-01-04 00:13:55 +04006 "testing"
Giorgi Lekveishvili7c427602024-01-04 00:13:55 +04007)
8
gioe72b54f2024-04-22 10:44:41 +04009var env = EnvConfig{
10 InfraName: "dodo",
11 Id: "id",
12 ContactEmail: "foo@bar.ge",
13 Domain: "bar.ge",
14 PrivateDomain: "p.bar.ge",
15 PublicIP: []net.IP{net.ParseIP("1.2.3.4")},
16 NameserverIP: []net.IP{net.ParseIP("1.2.3.4")},
17 NamespacePrefix: "id-",
18 Network: EnvNetwork{
19 DNS: net.ParseIP("1.1.1.1"),
20 DNSInClusterIP: net.ParseIP("2.2.2.2"),
21 Ingress: net.ParseIP("3.3.3.3"),
22 Headscale: net.ParseIP("4.4.4.4"),
23 ServicesFrom: net.ParseIP("5.5.5.5"),
24 ServicesTo: net.ParseIP("6.6.6.6"),
25 },
26}
27
Giorgi Lekveishvili67383962024-03-22 19:27:34 +040028func TestAuthProxyEnabled(t *testing.T) {
Giorgi Lekveishvili186eae52024-02-15 14:21:41 +040029 r := NewInMemoryAppRepository(CreateAllApps())
gio44f621b2024-04-29 09:44:38 +040030 for _, app := range []string{"rpuppy", "pi-hole", "url-shortener"} {
gio3cdee592024-04-17 10:15:56 +040031 a, err := FindEnvApp(r, app)
Giorgi Lekveishvili67383962024-03-22 19:27:34 +040032 if err != nil {
33 t.Fatal(err)
34 }
35 if a == nil {
36 t.Fatal("returned app is nil")
37 }
gio3cdee592024-04-17 10:15:56 +040038 release := Release{
39 Namespace: "foo",
40 }
gio3cdee592024-04-17 10:15:56 +040041 values := map[string]any{
42 "network": "Public",
43 "subdomain": "woof",
44 "auth": map[string]any{
45 "enabled": true,
46 "groups": "a,b",
Giorgi Lekveishvili67383962024-03-22 19:27:34 +040047 },
48 }
gio3cdee592024-04-17 10:15:56 +040049 rendered, err := a.Render(release, env, values)
Giorgi Lekveishvili67383962024-03-22 19:27:34 +040050 if err != nil {
51 t.Fatal(err)
52 }
53 for _, r := range rendered.Resources {
54 t.Log(string(r))
55 }
56 }
57}
58
59func TestAuthProxyDisabled(t *testing.T) {
60 r := NewInMemoryAppRepository(CreateAllApps())
gio44f621b2024-04-29 09:44:38 +040061 for _, app := range []string{"rpuppy", "pi-hole", "url-shortener"} {
gio3cdee592024-04-17 10:15:56 +040062 a, err := FindEnvApp(r, app)
Giorgi Lekveishvili67383962024-03-22 19:27:34 +040063 if err != nil {
64 t.Fatal(err)
65 }
66 if a == nil {
67 t.Fatal("returned app is nil")
68 }
gio3cdee592024-04-17 10:15:56 +040069 release := Release{
70 Namespace: "foo",
71 }
gio3cdee592024-04-17 10:15:56 +040072 values := map[string]any{
73 "network": "Public",
74 "subdomain": "woof",
75 "auth": map[string]any{
76 "enabled": false,
Giorgi Lekveishvili67383962024-03-22 19:27:34 +040077 },
78 }
gio3cdee592024-04-17 10:15:56 +040079 rendered, err := a.Render(release, env, values)
Giorgi Lekveishvili67383962024-03-22 19:27:34 +040080 if err != nil {
81 t.Fatal(err)
82 }
83 for _, r := range rendered.Resources {
84 t.Log(string(r))
85 }
86 }
87}
88
89func TestGroupMemberships(t *testing.T) {
90 r := NewInMemoryAppRepository(CreateAllApps())
gio3cdee592024-04-17 10:15:56 +040091 a, err := FindEnvApp(r, "memberships")
Giorgi Lekveishvili7c427602024-01-04 00:13:55 +040092 if err != nil {
Giorgi Lekveishvili186eae52024-02-15 14:21:41 +040093 t.Fatal(err)
Giorgi Lekveishvili7c427602024-01-04 00:13:55 +040094 }
Giorgi Lekveishvili186eae52024-02-15 14:21:41 +040095 if a == nil {
96 t.Fatal("returned app is nil")
Giorgi Lekveishvili7c427602024-01-04 00:13:55 +040097 }
gio3cdee592024-04-17 10:15:56 +040098 release := Release{
99 Namespace: "foo",
Giorgi Lekveishvili67383962024-03-22 19:27:34 +0400100 }
gio308105e2024-04-19 13:12:13 +0400101 values := map[string]any{
102 "authGroups": "foo,bar",
103 }
gio3cdee592024-04-17 10:15:56 +0400104 rendered, err := a.Render(release, env, values)
Giorgi Lekveishvili67383962024-03-22 19:27:34 +0400105 if err != nil {
106 t.Fatal(err)
107 }
108 for _, r := range rendered.Resources {
109 t.Log(string(r))
110 }
Giorgi Lekveishvili7c427602024-01-04 00:13:55 +0400111}
Giorgi Lekveishviliee15ee22024-03-28 12:35:10 +0400112
113func TestGerrit(t *testing.T) {
114 r := NewInMemoryAppRepository(CreateAllApps())
gio3cdee592024-04-17 10:15:56 +0400115 a, err := FindEnvApp(r, "gerrit")
Giorgi Lekveishviliee15ee22024-03-28 12:35:10 +0400116 if err != nil {
117 t.Fatal(err)
118 }
119 if a == nil {
120 t.Fatal("returned app is nil")
121 }
gio3cdee592024-04-17 10:15:56 +0400122 release := Release{
123 Namespace: "foo",
Giorgi Lekveishvili35982662024-04-05 13:05:40 +0400124 }
gio3cdee592024-04-17 10:15:56 +0400125 values := map[string]any{
126 "subdomain": "gerrit",
127 "network": "Private",
128 "key": map[string]any{
129 "public": "foo",
130 "private": "bar",
131 },
132 "sshPort": 22,
133 }
134 rendered, err := a.Render(release, env, values)
Giorgi Lekveishvili35982662024-04-05 13:05:40 +0400135 if err != nil {
136 t.Fatal(err)
137 }
138 for _, r := range rendered.Resources {
139 t.Log(string(r))
140 }
141}
142
143func TestJenkins(t *testing.T) {
144 r := NewInMemoryAppRepository(CreateAllApps())
gio3cdee592024-04-17 10:15:56 +0400145 a, err := FindEnvApp(r, "jenkins")
Giorgi Lekveishvili35982662024-04-05 13:05:40 +0400146 if err != nil {
147 t.Fatal(err)
148 }
149 if a == nil {
150 t.Fatal("returned app is nil")
151 }
gio3cdee592024-04-17 10:15:56 +0400152 release := Release{
153 Namespace: "foo",
Giorgi Lekveishviliee15ee22024-03-28 12:35:10 +0400154 }
gio3cdee592024-04-17 10:15:56 +0400155 values := map[string]any{
156 "subdomain": "jenkins",
157 "network": "Private",
158 }
159 rendered, err := a.Render(release, env, values)
Giorgi Lekveishviliee15ee22024-03-28 12:35:10 +0400160 if err != nil {
161 t.Fatal(err)
162 }
163 for _, r := range rendered.Resources {
164 t.Log(string(r))
165 }
166}
giodb274d12024-04-19 11:53:18 +0400167
168func TestIngressPublic(t *testing.T) {
169 r := NewInMemoryAppRepository(CreateAllApps())
170 a, err := FindInfraApp(r, "ingress-public")
171 if err != nil {
172 t.Fatal(err)
173 }
174 if a == nil {
175 t.Fatal("returned app is nil")
176 }
177 release := Release{
178 Namespace: "foo",
179 }
gioe72b54f2024-04-22 10:44:41 +0400180 infra := InfraConfig{
giodb274d12024-04-19 11:53:18 +0400181 Name: "dodo",
182 PublicIP: []net.IP{net.ParseIP("1.2.3.4")},
183 InfraNamespacePrefix: "id-",
184 InfraAdminPublicKey: []byte("foo"),
185 }
186 values := map[string]any{
187 "sshPrivateKey": "private",
188 }
gioe72b54f2024-04-22 10:44:41 +0400189 rendered, err := a.Render(release, infra, values)
giodb274d12024-04-19 11:53:18 +0400190 if err != nil {
191 t.Fatal(err)
192 }
193 for _, r := range rendered.Resources {
194 t.Log(string(r))
195 }
196}
197
198func TestPrivateNetwork(t *testing.T) {
199 r := NewInMemoryAppRepository(CreateAllApps())
200 a, err := FindEnvApp(r, "private-network")
201 if err != nil {
202 t.Fatal(err)
203 }
204 if a == nil {
205 t.Fatal("returned app is nil")
206 }
207 release := Release{
208 Namespace: "foo",
209 }
giodb274d12024-04-19 11:53:18 +0400210 values := map[string]any{
211 "privateNetwork": map[string]any{
212 "hostname": "foo",
213 "username": "bar",
214 "ipSubnet": "123123",
215 },
216 "sshPrivateKey": "private",
217 }
218 rendered, err := a.Render(release, env, values)
219 if err != nil {
220 t.Fatal(err)
221 }
222 for _, r := range rendered.Resources {
223 t.Log(string(r))
224 }
225}
gio308105e2024-04-19 13:12:13 +0400226
227func TestAppPackages(t *testing.T) {
228 contents, err := valuesTmpls.ReadFile("values-tmpl/rpuppy.cue")
229 if err != nil {
230 t.Fatal(err)
231 }
232 app, err := NewCueEnvApp(CueAppData{
gioe72b54f2024-04-22 10:44:41 +0400233 "base.cue": []byte(cueBaseConfig),
234 "app.cue": []byte(contents),
235 "global.cue": []byte(cueEnvAppGlobal),
gio308105e2024-04-19 13:12:13 +0400236 })
237 if err != nil {
238 t.Fatal(err)
239 }
240 release := Release{
241 Namespace: "foo",
242 }
gio308105e2024-04-19 13:12:13 +0400243 values := map[string]any{
244 "network": "Public",
245 "subdomain": "woof",
246 "auth": map[string]any{
247 "enabled": true,
248 "groups": "a,b",
249 },
250 }
251 rendered, err := app.Render(release, env, values)
252 if err != nil {
253 t.Fatal(err)
254 }
255 for _, r := range rendered.Resources {
256 t.Log(string(r))
257 }
258 for _, r := range rendered.Data {
259 t.Log(string(r))
260 }
261}
gioe72b54f2024-04-22 10:44:41 +0400262
263func TestDNSGateway(t *testing.T) {
264 contents, err := valuesTmpls.ReadFile("values-tmpl/dns-gateway.cue")
265 if err != nil {
266 t.Fatal(err)
267 }
268 app, err := NewCueInfraApp(CueAppData{
269 "base.cue": []byte(cueBaseConfig),
270 "app.cue": []byte(contents),
271 "global.cue": []byte(cueInfraAppGlobal),
272 })
273 if err != nil {
274 t.Fatal(err)
275 }
276 release := Release{
277 Namespace: "foo",
278 AppInstanceId: "dns-gateway",
279 RepoAddr: "ssh://192.168.100.210:22/config",
280 AppDir: "/infrastructure/gns-gateway",
281 }
282 infra := InfraConfig{
283 Name: "dodo",
284 PublicIP: []net.IP{net.ParseIP("135.181.48.180"), net.ParseIP("65.108.39.172")},
285 InfraNamespacePrefix: "dodo-",
286 InfraAdminPublicKey: []byte("ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC/ZRj0QJ0j+3udh0ANN9mJyEzrATZIOAHfNikDMpSHqrVbPZqpeHGbdYrSksCvXPXfissIZoYU4CCXX007jY0W6e1mPf1nObYh2eUT1dHo/8UtGaf9nYk+kEGU/k3utN4Uzkxa13IFh9pYERX+o0Ad3X5wh0vi5hjOBAJVKOCD9d3aipeR9piUb+qrkFDXf9fozMFn7D9nALkpJBVuGxwl/76f8K6hRxBEmPqZwIMfklzX15nRdLEcsGFJpYLYXsonbr1P3moMJFBBbQFv6M6JO9rrwA+swXpWMoScI7m/nziSEPLAb+ziv+/OyhqzeC9CQner73V0m8+2DmtcgTuSe1qHRtOScPyIjBfxoXaUx1IUkgq1NXt8k+EBO2mxnVpKdyDCvwT1Tb7088P8f8cSLtUOmUdEiAhB8bfQFprzm2KrlufenfhMvdvQPU4VfWlkQ4smLYt2yVaaXoxZMy5yD3X6LFurNXwee/Gn6di+DWqsASAOsmpsNgSCGhT8wxM= lekva@gl-mbp-m1-max.local"),
287 }
288 values := map[string]any{
289 "servers": []EnvDNS{EnvDNS{"v1.dodo.cloud", "10.0.1.2"}},
290 }
291 rendered, err := app.Render(release, infra, values)
292 if err != nil {
293 t.Fatal(err)
294 }
295 for _, r := range rendered.Resources {
296 t.Log(string(r))
297 }
298 for _, r := range rendered.Data {
299 t.Log(string(r))
300 }
301}
gio0eaf2712024-04-14 13:08:46 +0400302
303//go:embed testapp.cue
304var testAppCue []byte
305
306type appInput struct {
307 RepoAddr string `json:"repoAddr"`
308 SSHKey string `json:"sshKey"`
309 Network Network `json:"network"`
310}
311
312func TestPCloudApp(t *testing.T) {
313 _, err := NewDodoApp(testAppCue)
314 if err != nil {
315 t.Fatal(err)
316 }
317}