blob: 0838f14963ed670ae9b99d834ddf3da887efdf6f [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}]
475`
gio0eaf2712024-04-14 13:08:46 +0400476
gio7fbd4ad2024-08-27 10:06:39 +0400477var dodoAppDevEnabledCue = `
giofc441e32024-11-11 16:26:14 +0400478service: [{
479 name: "app"
giocfb228c2024-09-06 15:44:31 +0400480 type: "golang:1.20.0"
gio7fbd4ad2024-08-27 10:06:39 +0400481 run: "main.go"
gio4fa7eb32025-04-16 17:23:06 +0400482 ingress: [{
gio7fbd4ad2024-08-27 10:06:39 +0400483 network: "private"
484 subdomain: "testapp"
485 auth: enabled: false
gio4fa7eb32025-04-16 17:23:06 +0400486 }]
giofc441e32024-11-11 16:26:14 +0400487 volume: ["data"]
gio7fbd4ad2024-08-27 10:06:39 +0400488 dev: {
489 enabled: true
490 username: "gio"
491 }
giofc441e32024-11-11 16:26:14 +0400492 source: repository: "ssh://foo.bar"
493}]
494
495volume: [{
496 name: "data"
497 size: "5Gi"
498}]
499
500mongodb: [{
501 name: "db"
502 size: "10Gi"
503}]
504`
gio7fbd4ad2024-08-27 10:06:39 +0400505
506func TestDodoAppDevDisabled(t *testing.T) {
507 app, err := NewDodoApp([]byte(dodoAppDevDisabledCue))
gio1364e432024-06-29 11:39:18 +0400508 if err != nil {
gio12e887d2024-08-18 16:09:47 +0400509 for _, e := range errors.Errors(err) {
510 t.Log(e)
511 }
gio1364e432024-06-29 11:39:18 +0400512 t.Fatal(err)
513 }
gio12e887d2024-08-18 16:09:47 +0400514
gio1364e432024-06-29 11:39:18 +0400515 release := Release{
516 Namespace: "foo",
517 AppInstanceId: "foo-bar",
518 RepoAddr: "ssh://192.168.100.210:22/config",
519 AppDir: "/foo/bar",
520 }
gio7fbd4ad2024-08-27 10:06:39 +0400521 keyGen := testKeyGen{}
giof6ad2982024-08-23 17:42:49 +0400522 r, err := app.Render(release, env, networks, nil, map[string]any{
giofc441e32024-11-11 16:26:14 +0400523 "managerAddr": "",
524 "appId": "",
525 "sshPrivateKey": "",
gio7fbd4ad2024-08-27 10:06:39 +0400526 }, nil, keyGen)
gio0eaf2712024-04-14 13:08:46 +0400527 if err != nil {
gio7fbd4ad2024-08-27 10:06:39 +0400528 for _, e := range errors.Errors(err) {
529 for _, f := range errors.Errors(e) {
530 for _, g := range errors.Errors(f) {
531 t.Log(g)
532 }
533 }
534 }
gio0eaf2712024-04-14 13:08:46 +0400535 t.Fatal(err)
536 }
gio7fbd4ad2024-08-27 10:06:39 +0400537 t.Log(string(r.Raw))
538}
539
540func TestDodoAppDevEnabled(t *testing.T) {
541 app, err := NewDodoApp([]byte(dodoAppDevEnabledCue))
542 if err != nil {
543 for _, e := range errors.Errors(err) {
544 t.Log(e)
545 }
546 t.Fatal(err)
547 }
548
549 release := Release{
550 Namespace: "foo",
551 AppInstanceId: "foo-bar",
552 RepoAddr: "ssh://192.168.100.210:22/config",
553 AppDir: "/foo/bar",
554 }
555 keyGen := testKeyGen{}
giof6ad2982024-08-23 17:42:49 +0400556 r, err := app.Render(release, env, networks, nil, map[string]any{
giofc441e32024-11-11 16:26:14 +0400557 "managerAddr": "",
558 "appId": "",
559 "sshPrivateKey": "",
560 "username": "",
gio7fbd4ad2024-08-27 10:06:39 +0400561 }, nil, keyGen)
562 if err != nil {
563 for _, e := range errors.Errors(err) {
564 t.Log(e)
565 }
566 t.Fatal(err)
567 }
568 t.Log(string(r.Raw))
gio0eaf2712024-04-14 13:08:46 +0400569}
gio266c04f2024-07-03 14:18:45 +0400570
571func TestDodoAppInstance(t *testing.T) {
572 r := NewInMemoryAppRepository(CreateAllApps())
573 a, err := FindEnvApp(r, "dodo-app-instance")
574 if err != nil {
575 t.Fatal(err)
576 }
577 if a == nil {
578 t.Fatal("returned app is nil")
579 }
580 release := Release{
581 Namespace: "foo",
582 }
583 values := map[string]any{
gio266c04f2024-07-03 14:18:45 +0400584 "repoAddr": "",
gio33059762024-07-05 13:19:07 +0400585 "repoHost": "",
gio7fbd4ad2024-08-27 10:06:39 +0400586 "branch": "",
gio266c04f2024-07-03 14:18:45 +0400587 "gitRepoPublicKey": "",
gio7fbd4ad2024-08-27 10:06:39 +0400588 "username": "",
gio266c04f2024-07-03 14:18:45 +0400589 }
giof6ad2982024-08-23 17:42:49 +0400590 rendered, err := a.Render(release, env, networks, nil, values, nil, nil)
gio266c04f2024-07-03 14:18:45 +0400591 if err != nil {
592 t.Fatal(err)
593 }
594 for _, r := range rendered.Resources {
595 t.Log(string(r))
596 }
597}
gio4ece99c2024-07-18 11:05:50 +0400598
599func TestDodoApp(t *testing.T) {
600 contents, err := valuesTmpls.ReadFile("values-tmpl/dodo-app.cue")
601 if err != nil {
602 t.Fatal(err)
603 }
604 app, err := NewCueEnvApp(CueAppData{
605 "base.cue": []byte(cueBaseConfig),
606 "app.cue": []byte(contents),
607 "global.cue": []byte(cueEnvAppGlobal),
608 })
609 if err != nil {
610 t.Fatal(err)
611 }
612 t.Log(app.Schema())
613}
giof6ad2982024-08-23 17:42:49 +0400614
615func TestAppVirtualMachine(t *testing.T) {
616 contents, err := valuesTmpls.ReadFile("values-tmpl/virtual-machine.cue")
617 if err != nil {
618 t.Fatal(err)
619 }
620 app, err := NewCueEnvApp(CueAppData{
621 "base.cue": []byte(cueBaseConfig),
622 "app.cue": []byte(contents),
623 "global.cue": []byte(cueEnvAppGlobal),
624 })
625 if err != nil {
626 t.Fatal(err)
627 }
628 release := Release{
629 Namespace: "foo",
630 }
631 values := map[string]any{
632 "name": "foo",
633 "username": "bar",
634 "cpuCores": 1,
635 "memory": "1Gi",
636 }
637 rendered, err := app.Render(release, env, networks, nil, values, nil, nil)
638 if err != nil {
639 t.Fatal(err)
640 }
641 for _, r := range rendered.Resources {
642 t.Log(string(r))
643 }
644 for _, r := range rendered.Data {
645 t.Log(string(r))
646 }
647}
gio838bcb82025-05-15 19:39:04 +0400648
649func TestUpdateUsesPreviousValues(t *testing.T) {
650 contents := `
651input: {
652 port: int | *5
653}
654
655out: {
656 openPort: [{
657 name: "api"
658 network: networks["private"]
659 port: input.port
660 service: {
661 name: "app"
662 port: 8080
663 }
664 }]
665}
666
667input: {
668 port: 10
669}
670`
671 app, err := NewCueEnvApp(CueAppData{
672 "base.cue": []byte(cueBaseConfig),
673 "app.cue": []byte(contents),
674 "global.cue": []byte(cueEnvAppGlobal),
675 })
676 if err != nil {
677 t.Fatal(err)
678 }
679 a, ok := app.(cueEnvApp)
680 if !ok {
681 t.Fatal("expected cue app")
682 }
683 defaults, err := ExtractDefaultValues(a.cfg.LookupPath(cue.ParsePath("input")))
684 if err != nil {
685 t.Fatal(err)
686 }
687 t.Log(defaults)
688 if defaults.(map[string]any)["port"].(int64) != 10 {
689 t.Fatal("port")
690 }
691}
692
693func TestMerge(t *testing.T) {
694 x := map[string]any{
695 "key": map[string]any{
696 "pub": 1,
697 "priv": 2,
698 },
699 }
700 y := map[string]any{
701 "foo": 3,
702 }
703 z := merge(x, y)
704 if _, ok := z["foo"]; !ok {
705 t.Fatal(z)
706 }
707}