blob: 6d982a8d92e4a43b0963c6a37a8fb02717da45c4 [file] [log] [blame]
Giorgi Lekveishvili7c427602024-01-04 00:13:55 +04001package installer
2
3import (
gio0eaf2712024-04-14 13:08:46 +04004 _ "embed"
giocb34ad22024-07-11 08:01:13 +04005 "fmt"
gio3cdee592024-04-17 10:15:56 +04006 "net"
Giorgi Lekveishvili7c427602024-01-04 00:13:55 +04007 "testing"
gio12e887d2024-08-18 16:09:47 +04008
gio838bcb82025-05-15 19:39:04 +04009 "cuelang.org/go/cue"
gio12e887d2024-08-18 16:09:47 +040010 "cuelang.org/go/cue/errors"
Giorgi Lekveishvili7c427602024-01-04 00:13:55 +040011)
12
giocb34ad22024-07-11 08:01:13 +040013var (
14 env = EnvConfig{
15 InfraName: "dodo",
16 Id: "id",
17 ContactEmail: "foo@bar.ge",
18 Domain: "bar.ge",
19 PrivateDomain: "p.bar.ge",
20 PublicIP: []net.IP{net.ParseIP("1.2.3.4")},
21 NameserverIP: []net.IP{net.ParseIP("1.2.3.4")},
22 NamespacePrefix: "id-",
23 Network: EnvNetwork{
24 DNS: net.ParseIP("1.1.1.1"),
25 DNSInClusterIP: net.ParseIP("2.2.2.2"),
26 Ingress: net.ParseIP("3.3.3.3"),
27 Headscale: net.ParseIP("4.4.4.4"),
28 ServicesFrom: net.ParseIP("5.5.5.5"),
29 ServicesTo: net.ParseIP("6.6.6.6"),
30 },
31 }
32
gio7841f4f2024-07-26 19:53:49 +040033 infraNetworks = []InfraNetwork{
34 {
35 Name: "Public",
36 IngressClass: fmt.Sprintf("%s-ingress-public", env.InfraName),
37 CertificateIssuer: fmt.Sprintf("%s-public", env.Id),
38 AllocatePortAddr: fmt.Sprintf("http://port-allocator.%s-ingress-public.svc.cluster.local/api/allocate", env.InfraName),
39 ReservePortAddr: fmt.Sprintf("http://port-allocator.%s-ingress-public.svc.cluster.local/api/reserve", env.InfraName),
40 DeallocatePortAddr: fmt.Sprintf("http://port-allocator.%s-ingress-public.svc.cluster.local/api/remove", env.InfraName),
41 },
42 }
43
giocb34ad22024-07-11 08:01:13 +040044 networks = []Network{
45 {
46 Name: "Public",
47 IngressClass: fmt.Sprintf("%s-ingress-public", env.InfraName),
48 CertificateIssuer: fmt.Sprintf("%s-public", env.Id),
49 Domain: env.Domain,
50 AllocatePortAddr: fmt.Sprintf("http://port-allocator.%s-ingress-public.svc.cluster.local/api/allocate", env.InfraName),
51 ReservePortAddr: fmt.Sprintf("http://port-allocator.%s-ingress-public.svc.cluster.local/api/reserve", env.InfraName),
52 DeallocatePortAddr: fmt.Sprintf("http://port-allocator.%s-ingress-public.svc.cluster.local/api/remove", env.InfraName),
53 },
54 {
55 Name: "Private",
56 IngressClass: fmt.Sprintf("%s-ingress-private", env.Id),
57 Domain: env.PrivateDomain,
58 AllocatePortAddr: fmt.Sprintf("http://port-allocator.%s-ingress-private.svc.cluster.local/api/allocate", env.Id),
59 ReservePortAddr: fmt.Sprintf("http://port-allocator.%s-ingress-private.svc.cluster.local/api/reserve", env.Id),
60 DeallocatePortAddr: fmt.Sprintf("http://port-allocator.%s-ingress-private.svc.cluster.local/api/remove", env.Id),
61 },
62 }
giof15b9da2024-09-19 06:59:16 +040063
64 clusters = []Cluster{
65 {
66 Name: "default",
67 },
68 {
69 Name: "io",
70 IngressClassName: "io",
71 Kubeconfig: "kubeconfig",
72 },
73 }
giocb34ad22024-07-11 08:01:13 +040074)
gioe72b54f2024-04-22 10:44:41 +040075
Giorgi Lekveishvili67383962024-03-22 19:27:34 +040076func TestAuthProxyEnabled(t *testing.T) {
Giorgi Lekveishvili186eae52024-02-15 14:21:41 +040077 r := NewInMemoryAppRepository(CreateAllApps())
gio7fbd4ad2024-08-27 10:06:39 +040078 for _, app := range []string{"rpuppy"} {
gio3cdee592024-04-17 10:15:56 +040079 a, err := FindEnvApp(r, app)
Giorgi Lekveishvili67383962024-03-22 19:27:34 +040080 if err != nil {
81 t.Fatal(err)
82 }
83 if a == nil {
84 t.Fatal("returned app is nil")
85 }
gio3cdee592024-04-17 10:15:56 +040086 release := Release{
87 Namespace: "foo",
88 }
gio3cdee592024-04-17 10:15:56 +040089 values := map[string]any{
90 "network": "Public",
91 "subdomain": "woof",
92 "auth": map[string]any{
93 "enabled": true,
94 "groups": "a,b",
Giorgi Lekveishvili67383962024-03-22 19:27:34 +040095 },
96 }
giof6ad2982024-08-23 17:42:49 +040097 rendered, err := a.Render(release, env, networks, nil, values, nil, nil)
Giorgi Lekveishvili67383962024-03-22 19:27:34 +040098 if err != nil {
99 t.Fatal(err)
100 }
101 for _, r := range rendered.Resources {
102 t.Log(string(r))
103 }
104 }
105}
106
107func TestAuthProxyDisabled(t *testing.T) {
108 r := NewInMemoryAppRepository(CreateAllApps())
gio7fbd4ad2024-08-27 10:06:39 +0400109 for _, app := range []string{"rpuppy"} {
gio3cdee592024-04-17 10:15:56 +0400110 a, err := FindEnvApp(r, app)
Giorgi Lekveishvili67383962024-03-22 19:27:34 +0400111 if err != nil {
112 t.Fatal(err)
113 }
114 if a == nil {
115 t.Fatal("returned app is nil")
116 }
gio3cdee592024-04-17 10:15:56 +0400117 release := Release{
118 Namespace: "foo",
119 }
gio3cdee592024-04-17 10:15:56 +0400120 values := map[string]any{
121 "network": "Public",
122 "subdomain": "woof",
123 "auth": map[string]any{
124 "enabled": false,
Giorgi Lekveishvili67383962024-03-22 19:27:34 +0400125 },
126 }
giof6ad2982024-08-23 17:42:49 +0400127 rendered, err := a.Render(release, env, networks, nil, values, nil, nil)
Giorgi Lekveishvili67383962024-03-22 19:27:34 +0400128 if err != nil {
129 t.Fatal(err)
130 }
131 for _, r := range rendered.Resources {
132 t.Log(string(r))
133 }
134 }
135}
136
137func TestGroupMemberships(t *testing.T) {
138 r := NewInMemoryAppRepository(CreateAllApps())
gio3cdee592024-04-17 10:15:56 +0400139 a, err := FindEnvApp(r, "memberships")
Giorgi Lekveishvili7c427602024-01-04 00:13:55 +0400140 if err != nil {
Giorgi Lekveishvili186eae52024-02-15 14:21:41 +0400141 t.Fatal(err)
Giorgi Lekveishvili7c427602024-01-04 00:13:55 +0400142 }
Giorgi Lekveishvili186eae52024-02-15 14:21:41 +0400143 if a == nil {
144 t.Fatal("returned app is nil")
Giorgi Lekveishvili7c427602024-01-04 00:13:55 +0400145 }
gio3cdee592024-04-17 10:15:56 +0400146 release := Release{
147 Namespace: "foo",
Giorgi Lekveishvili67383962024-03-22 19:27:34 +0400148 }
gio308105e2024-04-19 13:12:13 +0400149 values := map[string]any{
gio7841f4f2024-07-26 19:53:49 +0400150 "network": "Public",
gio308105e2024-04-19 13:12:13 +0400151 "authGroups": "foo,bar",
152 }
giof6ad2982024-08-23 17:42:49 +0400153 rendered, err := a.Render(release, env, networks, nil, values, nil, nil)
Giorgi Lekveishvili67383962024-03-22 19:27:34 +0400154 if err != nil {
155 t.Fatal(err)
156 }
157 for _, r := range rendered.Resources {
158 t.Log(string(r))
159 }
Giorgi Lekveishvili7c427602024-01-04 00:13:55 +0400160}
Giorgi Lekveishviliee15ee22024-03-28 12:35:10 +0400161
162func TestGerrit(t *testing.T) {
163 r := NewInMemoryAppRepository(CreateAllApps())
gio3cdee592024-04-17 10:15:56 +0400164 a, err := FindEnvApp(r, "gerrit")
Giorgi Lekveishviliee15ee22024-03-28 12:35:10 +0400165 if err != nil {
166 t.Fatal(err)
167 }
168 if a == nil {
169 t.Fatal("returned app is nil")
170 }
gio3cdee592024-04-17 10:15:56 +0400171 release := Release{
172 Namespace: "foo",
Giorgi Lekveishvili35982662024-04-05 13:05:40 +0400173 }
gio3cdee592024-04-17 10:15:56 +0400174 values := map[string]any{
175 "subdomain": "gerrit",
176 "network": "Private",
177 "key": map[string]any{
178 "public": "foo",
179 "private": "bar",
180 },
181 "sshPort": 22,
182 }
giof6ad2982024-08-23 17:42:49 +0400183 rendered, err := a.Render(release, env, networks, nil, values, nil, nil)
Giorgi Lekveishvili35982662024-04-05 13:05:40 +0400184 if err != nil {
185 t.Fatal(err)
186 }
187 for _, r := range rendered.Resources {
188 t.Log(string(r))
189 }
190}
191
192func TestJenkins(t *testing.T) {
193 r := NewInMemoryAppRepository(CreateAllApps())
gio3cdee592024-04-17 10:15:56 +0400194 a, err := FindEnvApp(r, "jenkins")
Giorgi Lekveishvili35982662024-04-05 13:05:40 +0400195 if err != nil {
196 t.Fatal(err)
197 }
198 if a == nil {
199 t.Fatal("returned app is nil")
200 }
gio3cdee592024-04-17 10:15:56 +0400201 release := Release{
202 Namespace: "foo",
Giorgi Lekveishviliee15ee22024-03-28 12:35:10 +0400203 }
gio3cdee592024-04-17 10:15:56 +0400204 values := map[string]any{
205 "subdomain": "jenkins",
206 "network": "Private",
207 }
giof6ad2982024-08-23 17:42:49 +0400208 rendered, err := a.Render(release, env, networks, nil, values, nil, nil)
Giorgi Lekveishviliee15ee22024-03-28 12:35:10 +0400209 if err != nil {
210 t.Fatal(err)
211 }
212 for _, r := range rendered.Resources {
213 t.Log(string(r))
214 }
215}
giodb274d12024-04-19 11:53:18 +0400216
217func TestIngressPublic(t *testing.T) {
218 r := NewInMemoryAppRepository(CreateAllApps())
219 a, err := FindInfraApp(r, "ingress-public")
220 if err != nil {
221 t.Fatal(err)
222 }
223 if a == nil {
224 t.Fatal("returned app is nil")
225 }
226 release := Release{
227 Namespace: "foo",
228 }
gioe72b54f2024-04-22 10:44:41 +0400229 infra := InfraConfig{
giodb274d12024-04-19 11:53:18 +0400230 Name: "dodo",
231 PublicIP: []net.IP{net.ParseIP("1.2.3.4")},
232 InfraNamespacePrefix: "id-",
233 InfraAdminPublicKey: []byte("foo"),
234 }
235 values := map[string]any{
236 "sshPrivateKey": "private",
237 }
gio7841f4f2024-07-26 19:53:49 +0400238 rendered, err := a.Render(release, infra, infraNetworks, values, nil)
giodb274d12024-04-19 11:53:18 +0400239 if err != nil {
240 t.Fatal(err)
241 }
242 for _, r := range rendered.Resources {
243 t.Log(string(r))
244 }
245}
246
247func TestPrivateNetwork(t *testing.T) {
248 r := NewInMemoryAppRepository(CreateAllApps())
249 a, err := FindEnvApp(r, "private-network")
250 if err != nil {
251 t.Fatal(err)
252 }
253 if a == nil {
254 t.Fatal("returned app is nil")
255 }
256 release := Release{
257 Namespace: "foo",
258 }
giodb274d12024-04-19 11:53:18 +0400259 values := map[string]any{
260 "privateNetwork": map[string]any{
261 "hostname": "foo",
262 "username": "bar",
263 "ipSubnet": "123123",
264 },
265 "sshPrivateKey": "private",
266 }
giof6ad2982024-08-23 17:42:49 +0400267 rendered, err := a.Render(release, env, networks, nil, values, nil, nil)
giodb274d12024-04-19 11:53:18 +0400268 if err != nil {
269 t.Fatal(err)
270 }
271 for _, r := range rendered.Resources {
272 t.Log(string(r))
273 }
274}
gio308105e2024-04-19 13:12:13 +0400275
276func TestAppPackages(t *testing.T) {
277 contents, err := valuesTmpls.ReadFile("values-tmpl/rpuppy.cue")
278 if err != nil {
279 t.Fatal(err)
280 }
281 app, err := NewCueEnvApp(CueAppData{
gioe72b54f2024-04-22 10:44:41 +0400282 "base.cue": []byte(cueBaseConfig),
283 "app.cue": []byte(contents),
284 "global.cue": []byte(cueEnvAppGlobal),
gio308105e2024-04-19 13:12:13 +0400285 })
286 if err != nil {
287 t.Fatal(err)
288 }
289 release := Release{
290 Namespace: "foo",
291 }
gio308105e2024-04-19 13:12:13 +0400292 values := map[string]any{
293 "network": "Public",
294 "subdomain": "woof",
295 "auth": map[string]any{
296 "enabled": true,
297 "groups": "a,b",
298 },
299 }
giof6ad2982024-08-23 17:42:49 +0400300 rendered, err := app.Render(release, env, networks, nil, values, nil, nil)
gio308105e2024-04-19 13:12:13 +0400301 if err != nil {
302 t.Fatal(err)
303 }
304 for _, r := range rendered.Resources {
305 t.Log(string(r))
306 }
307 for _, r := range rendered.Data {
308 t.Log(string(r))
309 }
310}
gioe72b54f2024-04-22 10:44:41 +0400311
giof15b9da2024-09-19 06:59:16 +0400312func TestAppPackagesRemoteCluster(t *testing.T) {
313 contents, err := valuesTmpls.ReadFile("values-tmpl/rpuppy.cue")
314 if err != nil {
315 t.Fatal(err)
316 }
317 app, err := NewCueEnvApp(CueAppData{
318 "base.cue": []byte(cueBaseConfig),
319 "app.cue": []byte(contents),
320 "global.cue": []byte(cueEnvAppGlobal),
321 })
322 if err != nil {
323 t.Fatal(err)
324 }
325 release := Release{
326 Namespace: "foo",
327 }
328 values := map[string]any{
329 "network": "Public",
330 "subdomain": "woof",
331 "auth": map[string]any{
332 "enabled": false,
333 },
334 "cluster": "io",
335 }
336 rendered, err := app.Render(release, env, networks, clusters, values, nil, nil)
337 if err != nil {
338 t.Fatal(err)
339 }
340 for _, r := range rendered.Resources {
341 t.Log(string(r))
342 }
343 for _, r := range rendered.Data {
344 t.Log(string(r))
345 }
346}
347
gio8f290322024-09-21 15:37:45 +0400348func TestLonghorn(t *testing.T) {
349 contents, err := valuesTmpls.ReadFile("values-tmpl/longhorn.cue")
350 if err != nil {
351 t.Fatal(err)
352 }
353 app, err := NewCueEnvApp(CueAppData{
354 "base.cue": []byte(cueBaseConfig),
355 "app.cue": []byte(contents),
356 "global.cue": []byte(cueEnvAppGlobal),
357 })
358 if err != nil {
359 t.Fatal(err)
360 }
361 t.Logf("%+v\n", app.Schema())
362}
363
gioe72b54f2024-04-22 10:44:41 +0400364func TestDNSGateway(t *testing.T) {
365 contents, err := valuesTmpls.ReadFile("values-tmpl/dns-gateway.cue")
366 if err != nil {
367 t.Fatal(err)
368 }
369 app, err := NewCueInfraApp(CueAppData{
370 "base.cue": []byte(cueBaseConfig),
371 "app.cue": []byte(contents),
372 "global.cue": []byte(cueInfraAppGlobal),
373 })
374 if err != nil {
375 t.Fatal(err)
376 }
377 release := Release{
378 Namespace: "foo",
379 AppInstanceId: "dns-gateway",
380 RepoAddr: "ssh://192.168.100.210:22/config",
381 AppDir: "/infrastructure/gns-gateway",
382 }
383 infra := InfraConfig{
384 Name: "dodo",
385 PublicIP: []net.IP{net.ParseIP("135.181.48.180"), net.ParseIP("65.108.39.172")},
386 InfraNamespacePrefix: "dodo-",
387 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"),
388 }
389 values := map[string]any{
390 "servers": []EnvDNS{EnvDNS{"v1.dodo.cloud", "10.0.1.2"}},
391 }
gio7841f4f2024-07-26 19:53:49 +0400392 rendered, err := app.Render(release, infra, infraNetworks, values, nil)
gioe72b54f2024-04-22 10:44:41 +0400393 if err != nil {
394 t.Fatal(err)
395 }
396 for _, r := range rendered.Resources {
397 t.Log(string(r))
398 }
399 for _, r := range rendered.Data {
400 t.Log(string(r))
401 }
402}
gio0eaf2712024-04-14 13:08:46 +0400403
giof15b9da2024-09-19 06:59:16 +0400404var dodoAppRemoteClusterCue = `
giofc441e32024-11-11 16:26:14 +0400405service: [{
406 name: "app"
giof15b9da2024-09-19 06:59:16 +0400407 type: "golang:1.22.0"
408 run: "main.go"
gio4fa7eb32025-04-16 17:23:06 +0400409 ingress: [{
giof15b9da2024-09-19 06:59:16 +0400410 network: "private"
411 subdomain: "testapp"
412 auth: enabled: false
gio4fa7eb32025-04-16 17:23:06 +0400413 }]
giof15b9da2024-09-19 06:59:16 +0400414 dev: {
415 enabled: false
416 }
417 cluster: "io"
giofc441e32024-11-11 16:26:14 +0400418 source: repository: "ssh://foo.bar"
419}]`
giof15b9da2024-09-19 06:59:16 +0400420
421func TestDodoAppRemoteCluster(t *testing.T) {
422 app, err := NewDodoApp([]byte(dodoAppRemoteClusterCue))
423 if err != nil {
424 for _, e := range errors.Errors(err) {
425 t.Log(e)
426 }
427 t.Fatal(err)
428 }
429
430 release := Release{
431 Namespace: "foo",
432 AppInstanceId: "foo-bar",
433 RepoAddr: "ssh://192.168.100.210:22/config",
434 AppDir: "/foo/bar",
435 }
436 keyGen := testKeyGen{}
437 r, err := app.Render(release, env, networks, clusters, map[string]any{
giofc441e32024-11-11 16:26:14 +0400438 "managerAddr": "3",
439 "appId": "4",
440 "sshPrivateKey": "6",
giof15b9da2024-09-19 06:59:16 +0400441 }, nil, keyGen)
442 if err != nil {
443 for _, e := range errors.Errors(err) {
444 for _, f := range errors.Errors(e) {
445 for _, g := range errors.Errors(f) {
446 t.Log(g)
447 }
448 }
449 }
450 t.Fatal(err)
451 }
452 t.Log(string(r.Raw))
453}
454
gio7fbd4ad2024-08-27 10:06:39 +0400455var dodoAppDevDisabledCue = `
giofc441e32024-11-11 16:26:14 +0400456service: [{
457 name: "app"
gio7fbd4ad2024-08-27 10:06:39 +0400458 type: "golang:1.22.0"
459 run: "main.go"
gio4fa7eb32025-04-16 17:23:06 +0400460 ingress: [{
gio7fbd4ad2024-08-27 10:06:39 +0400461 network: "private"
462 subdomain: "testapp"
463 auth: enabled: false
gio4fa7eb32025-04-16 17:23:06 +0400464 }]
gio7fbd4ad2024-08-27 10:06:39 +0400465 dev: {
466 enabled: false
467 }
giofc441e32024-11-11 16:26:14 +0400468 source: repository: "ssh://foo.bar"
gio4e3b24d2025-04-23 15:29:13 +0400469}]
470
471mongodb: [{
472 name: "db"
473 size: "10Gi"
474}]
gio6481c902025-05-20 16:16:30 +0400475
476postgresql: [{
477 name: "pg"
478 size: "10Gi"
479}]
gio4e3b24d2025-04-23 15:29:13 +0400480`
gio0eaf2712024-04-14 13:08:46 +0400481
gio7fbd4ad2024-08-27 10:06:39 +0400482var dodoAppDevEnabledCue = `
giofc441e32024-11-11 16:26:14 +0400483service: [{
484 name: "app"
giocfb228c2024-09-06 15:44:31 +0400485 type: "golang:1.20.0"
gio7fbd4ad2024-08-27 10:06:39 +0400486 run: "main.go"
gio4fa7eb32025-04-16 17:23:06 +0400487 ingress: [{
gio7fbd4ad2024-08-27 10:06:39 +0400488 network: "private"
489 subdomain: "testapp"
490 auth: enabled: false
gio4fa7eb32025-04-16 17:23:06 +0400491 }]
giofc441e32024-11-11 16:26:14 +0400492 volume: ["data"]
gio7fbd4ad2024-08-27 10:06:39 +0400493 dev: {
494 enabled: true
495 username: "gio"
496 }
giofc441e32024-11-11 16:26:14 +0400497 source: repository: "ssh://foo.bar"
498}]
499
500volume: [{
501 name: "data"
502 size: "5Gi"
503}]
504
505mongodb: [{
506 name: "db"
507 size: "10Gi"
508}]
509`
gio7fbd4ad2024-08-27 10:06:39 +0400510
511func TestDodoAppDevDisabled(t *testing.T) {
512 app, err := NewDodoApp([]byte(dodoAppDevDisabledCue))
gio1364e432024-06-29 11:39:18 +0400513 if err != nil {
gio12e887d2024-08-18 16:09:47 +0400514 for _, e := range errors.Errors(err) {
515 t.Log(e)
516 }
gio1364e432024-06-29 11:39:18 +0400517 t.Fatal(err)
518 }
gio12e887d2024-08-18 16:09:47 +0400519
gio1364e432024-06-29 11:39:18 +0400520 release := Release{
521 Namespace: "foo",
522 AppInstanceId: "foo-bar",
523 RepoAddr: "ssh://192.168.100.210:22/config",
524 AppDir: "/foo/bar",
525 }
gio7fbd4ad2024-08-27 10:06:39 +0400526 keyGen := testKeyGen{}
giof6ad2982024-08-23 17:42:49 +0400527 r, err := app.Render(release, env, networks, nil, map[string]any{
giofc441e32024-11-11 16:26:14 +0400528 "managerAddr": "",
529 "appId": "",
530 "sshPrivateKey": "",
gio7fbd4ad2024-08-27 10:06:39 +0400531 }, nil, keyGen)
gio0eaf2712024-04-14 13:08:46 +0400532 if err != nil {
gio7fbd4ad2024-08-27 10:06:39 +0400533 for _, e := range errors.Errors(err) {
534 for _, f := range errors.Errors(e) {
535 for _, g := range errors.Errors(f) {
536 t.Log(g)
537 }
538 }
539 }
gio0eaf2712024-04-14 13:08:46 +0400540 t.Fatal(err)
541 }
gio7fbd4ad2024-08-27 10:06:39 +0400542 t.Log(string(r.Raw))
543}
544
545func TestDodoAppDevEnabled(t *testing.T) {
546 app, err := NewDodoApp([]byte(dodoAppDevEnabledCue))
547 if err != nil {
548 for _, e := range errors.Errors(err) {
549 t.Log(e)
550 }
551 t.Fatal(err)
552 }
553
554 release := Release{
555 Namespace: "foo",
556 AppInstanceId: "foo-bar",
557 RepoAddr: "ssh://192.168.100.210:22/config",
558 AppDir: "/foo/bar",
559 }
560 keyGen := testKeyGen{}
giof6ad2982024-08-23 17:42:49 +0400561 r, err := app.Render(release, env, networks, nil, map[string]any{
giofc441e32024-11-11 16:26:14 +0400562 "managerAddr": "",
563 "appId": "",
564 "sshPrivateKey": "",
565 "username": "",
gio6481c902025-05-20 16:16:30 +0400566 "password_mongodb_db": "foo",
gio7fbd4ad2024-08-27 10:06:39 +0400567 }, nil, keyGen)
568 if err != nil {
569 for _, e := range errors.Errors(err) {
570 t.Log(e)
571 }
572 t.Fatal(err)
573 }
574 t.Log(string(r.Raw))
gio0eaf2712024-04-14 13:08:46 +0400575}
gio266c04f2024-07-03 14:18:45 +0400576
577func TestDodoAppInstance(t *testing.T) {
578 r := NewInMemoryAppRepository(CreateAllApps())
579 a, err := FindEnvApp(r, "dodo-app-instance")
580 if err != nil {
581 t.Fatal(err)
582 }
583 if a == nil {
584 t.Fatal("returned app is nil")
585 }
586 release := Release{
587 Namespace: "foo",
588 }
589 values := map[string]any{
gio266c04f2024-07-03 14:18:45 +0400590 "repoAddr": "",
gio33059762024-07-05 13:19:07 +0400591 "repoHost": "",
gio7fbd4ad2024-08-27 10:06:39 +0400592 "branch": "",
gio266c04f2024-07-03 14:18:45 +0400593 "gitRepoPublicKey": "",
gio7fbd4ad2024-08-27 10:06:39 +0400594 "username": "",
gio266c04f2024-07-03 14:18:45 +0400595 }
giof6ad2982024-08-23 17:42:49 +0400596 rendered, err := a.Render(release, env, networks, nil, values, nil, nil)
gio266c04f2024-07-03 14:18:45 +0400597 if err != nil {
598 t.Fatal(err)
599 }
600 for _, r := range rendered.Resources {
601 t.Log(string(r))
602 }
603}
gio4ece99c2024-07-18 11:05:50 +0400604
605func TestDodoApp(t *testing.T) {
606 contents, err := valuesTmpls.ReadFile("values-tmpl/dodo-app.cue")
607 if err != nil {
608 t.Fatal(err)
609 }
610 app, err := NewCueEnvApp(CueAppData{
611 "base.cue": []byte(cueBaseConfig),
612 "app.cue": []byte(contents),
613 "global.cue": []byte(cueEnvAppGlobal),
614 })
615 if err != nil {
616 t.Fatal(err)
617 }
618 t.Log(app.Schema())
619}
giof6ad2982024-08-23 17:42:49 +0400620
621func TestAppVirtualMachine(t *testing.T) {
622 contents, err := valuesTmpls.ReadFile("values-tmpl/virtual-machine.cue")
623 if err != nil {
624 t.Fatal(err)
625 }
626 app, err := NewCueEnvApp(CueAppData{
627 "base.cue": []byte(cueBaseConfig),
628 "app.cue": []byte(contents),
629 "global.cue": []byte(cueEnvAppGlobal),
630 })
631 if err != nil {
632 t.Fatal(err)
633 }
634 release := Release{
635 Namespace: "foo",
636 }
637 values := map[string]any{
638 "name": "foo",
639 "username": "bar",
640 "cpuCores": 1,
641 "memory": "1Gi",
642 }
643 rendered, err := app.Render(release, env, networks, nil, values, nil, nil)
644 if err != nil {
645 t.Fatal(err)
646 }
647 for _, r := range rendered.Resources {
648 t.Log(string(r))
649 }
650 for _, r := range rendered.Data {
651 t.Log(string(r))
652 }
653}
gio838bcb82025-05-15 19:39:04 +0400654
655func TestUpdateUsesPreviousValues(t *testing.T) {
656 contents := `
657input: {
658 port: int | *5
659}
660
661out: {
662 openPort: [{
663 name: "api"
664 network: networks["private"]
665 port: input.port
666 service: {
667 name: "app"
668 port: 8080
669 }
670 }]
671}
672
673input: {
674 port: 10
675}
676`
677 app, err := NewCueEnvApp(CueAppData{
678 "base.cue": []byte(cueBaseConfig),
679 "app.cue": []byte(contents),
680 "global.cue": []byte(cueEnvAppGlobal),
681 })
682 if err != nil {
683 t.Fatal(err)
684 }
685 a, ok := app.(cueEnvApp)
686 if !ok {
687 t.Fatal("expected cue app")
688 }
689 defaults, err := ExtractDefaultValues(a.cfg.LookupPath(cue.ParsePath("input")))
690 if err != nil {
691 t.Fatal(err)
692 }
693 t.Log(defaults)
694 if defaults.(map[string]any)["port"].(int64) != 10 {
695 t.Fatal("port")
696 }
697}
698
699func TestMerge(t *testing.T) {
700 x := map[string]any{
701 "key": map[string]any{
702 "pub": 1,
703 "priv": 2,
704 },
705 }
706 y := map[string]any{
707 "foo": 3,
708 }
709 z := merge(x, y)
710 if _, ok := z["foo"]; !ok {
711 t.Fatal(z)
712 }
713}