blob: f8b07584c1bdd518f20238da7a848bf092ab2746 [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
gioe10ba162025-07-31 19:52:29 +0400495 mode: "VM"
gio7fbd4ad2024-08-27 10:06:39 +0400496 username: "gio"
497 }
giofc441e32024-11-11 16:26:14 +0400498 source: repository: "ssh://foo.bar"
499}]
500
501volume: [{
502 name: "data"
503 size: "5Gi"
504}]
505
506mongodb: [{
507 name: "db"
508 size: "10Gi"
509}]
510`
gio7fbd4ad2024-08-27 10:06:39 +0400511
512func TestDodoAppDevDisabled(t *testing.T) {
513 app, err := NewDodoApp([]byte(dodoAppDevDisabledCue))
gio1364e432024-06-29 11:39:18 +0400514 if err != nil {
gio12e887d2024-08-18 16:09:47 +0400515 for _, e := range errors.Errors(err) {
516 t.Log(e)
517 }
gio1364e432024-06-29 11:39:18 +0400518 t.Fatal(err)
519 }
gio12e887d2024-08-18 16:09:47 +0400520
gio1364e432024-06-29 11:39:18 +0400521 release := Release{
522 Namespace: "foo",
523 AppInstanceId: "foo-bar",
524 RepoAddr: "ssh://192.168.100.210:22/config",
525 AppDir: "/foo/bar",
526 }
gio7fbd4ad2024-08-27 10:06:39 +0400527 keyGen := testKeyGen{}
giof6ad2982024-08-23 17:42:49 +0400528 r, err := app.Render(release, env, networks, nil, map[string]any{
giofc441e32024-11-11 16:26:14 +0400529 "managerAddr": "",
530 "appId": "",
531 "sshPrivateKey": "",
gio7fbd4ad2024-08-27 10:06:39 +0400532 }, nil, keyGen)
gio0eaf2712024-04-14 13:08:46 +0400533 if err != nil {
gio7fbd4ad2024-08-27 10:06:39 +0400534 for _, e := range errors.Errors(err) {
535 for _, f := range errors.Errors(e) {
536 for _, g := range errors.Errors(f) {
537 t.Log(g)
538 }
539 }
540 }
gio0eaf2712024-04-14 13:08:46 +0400541 t.Fatal(err)
542 }
gio7fbd4ad2024-08-27 10:06:39 +0400543 t.Log(string(r.Raw))
544}
545
546func TestDodoAppDevEnabled(t *testing.T) {
547 app, err := NewDodoApp([]byte(dodoAppDevEnabledCue))
548 if err != nil {
549 for _, e := range errors.Errors(err) {
550 t.Log(e)
551 }
552 t.Fatal(err)
553 }
554
555 release := Release{
556 Namespace: "foo",
557 AppInstanceId: "foo-bar",
558 RepoAddr: "ssh://192.168.100.210:22/config",
559 AppDir: "/foo/bar",
560 }
561 keyGen := testKeyGen{}
giof6ad2982024-08-23 17:42:49 +0400562 r, err := app.Render(release, env, networks, nil, map[string]any{
gioe10ba162025-07-31 19:52:29 +0400563 "managerAddr": "",
564 "appId": "",
565 "sshPrivateKey": "",
566 "username": "",
gio6481c902025-05-20 16:16:30 +0400567 "password_mongodb_db": "foo",
gio7fbd4ad2024-08-27 10:06:39 +0400568 }, nil, keyGen)
569 if err != nil {
570 for _, e := range errors.Errors(err) {
571 t.Log(e)
572 }
573 t.Fatal(err)
574 }
575 t.Log(string(r.Raw))
gio0eaf2712024-04-14 13:08:46 +0400576}
gio266c04f2024-07-03 14:18:45 +0400577
578func TestDodoAppInstance(t *testing.T) {
579 r := NewInMemoryAppRepository(CreateAllApps())
580 a, err := FindEnvApp(r, "dodo-app-instance")
581 if err != nil {
582 t.Fatal(err)
583 }
584 if a == nil {
585 t.Fatal("returned app is nil")
586 }
587 release := Release{
588 Namespace: "foo",
589 }
590 values := map[string]any{
gio266c04f2024-07-03 14:18:45 +0400591 "repoAddr": "",
gio33059762024-07-05 13:19:07 +0400592 "repoHost": "",
gio7fbd4ad2024-08-27 10:06:39 +0400593 "branch": "",
gio266c04f2024-07-03 14:18:45 +0400594 "gitRepoPublicKey": "",
gio7fbd4ad2024-08-27 10:06:39 +0400595 "username": "",
gio266c04f2024-07-03 14:18:45 +0400596 }
giof6ad2982024-08-23 17:42:49 +0400597 rendered, err := a.Render(release, env, networks, nil, values, nil, nil)
gio266c04f2024-07-03 14:18:45 +0400598 if err != nil {
599 t.Fatal(err)
600 }
601 for _, r := range rendered.Resources {
602 t.Log(string(r))
603 }
604}
gio4ece99c2024-07-18 11:05:50 +0400605
606func TestDodoApp(t *testing.T) {
607 contents, err := valuesTmpls.ReadFile("values-tmpl/dodo-app.cue")
608 if err != nil {
609 t.Fatal(err)
610 }
611 app, err := NewCueEnvApp(CueAppData{
612 "base.cue": []byte(cueBaseConfig),
613 "app.cue": []byte(contents),
614 "global.cue": []byte(cueEnvAppGlobal),
615 })
616 if err != nil {
617 t.Fatal(err)
618 }
619 t.Log(app.Schema())
620}
giof6ad2982024-08-23 17:42:49 +0400621
622func TestAppVirtualMachine(t *testing.T) {
623 contents, err := valuesTmpls.ReadFile("values-tmpl/virtual-machine.cue")
624 if err != nil {
625 t.Fatal(err)
626 }
627 app, err := NewCueEnvApp(CueAppData{
628 "base.cue": []byte(cueBaseConfig),
629 "app.cue": []byte(contents),
630 "global.cue": []byte(cueEnvAppGlobal),
631 })
632 if err != nil {
633 t.Fatal(err)
634 }
635 release := Release{
636 Namespace: "foo",
637 }
638 values := map[string]any{
639 "name": "foo",
640 "username": "bar",
641 "cpuCores": 1,
642 "memory": "1Gi",
643 }
644 rendered, err := app.Render(release, env, networks, nil, values, nil, nil)
645 if err != nil {
646 t.Fatal(err)
647 }
648 for _, r := range rendered.Resources {
649 t.Log(string(r))
650 }
651 for _, r := range rendered.Data {
652 t.Log(string(r))
653 }
654}
gio838bcb82025-05-15 19:39:04 +0400655
656func TestUpdateUsesPreviousValues(t *testing.T) {
657 contents := `
658input: {
659 port: int | *5
660}
661
662out: {
663 openPort: [{
664 name: "api"
665 network: networks["private"]
666 port: input.port
667 service: {
668 name: "app"
669 port: 8080
670 }
671 }]
672}
673
674input: {
675 port: 10
676}
677`
678 app, err := NewCueEnvApp(CueAppData{
679 "base.cue": []byte(cueBaseConfig),
680 "app.cue": []byte(contents),
681 "global.cue": []byte(cueEnvAppGlobal),
682 })
683 if err != nil {
684 t.Fatal(err)
685 }
686 a, ok := app.(cueEnvApp)
687 if !ok {
688 t.Fatal("expected cue app")
689 }
690 defaults, err := ExtractDefaultValues(a.cfg.LookupPath(cue.ParsePath("input")))
691 if err != nil {
692 t.Fatal(err)
693 }
694 t.Log(defaults)
695 if defaults.(map[string]any)["port"].(int64) != 10 {
696 t.Fatal("port")
697 }
698}
699
700func TestMerge(t *testing.T) {
701 x := map[string]any{
702 "key": map[string]any{
703 "pub": 1,
704 "priv": 2,
705 },
706 }
707 y := map[string]any{
708 "foo": 3,
709 }
710 z := merge(x, y)
711 if _, ok := z["foo"]; !ok {
712 t.Fatal(z)
713 }
714}