blob: b12384f25b81174eed28f5858f7fbc4df71747fd [file] [log] [blame]
gio561724f2024-11-04 08:37:34 +04001package installer
2
3import (
gio721c0042025-04-03 11:56:36 +04004 "bytes"
5 "encoding/json"
giod78896a2025-04-10 07:42:13 +04006 "fmt"
gio561724f2024-11-04 08:37:34 +04007 "testing"
8
9 "cuelang.org/go/cue/errors"
10)
11
giofc441e32024-11-11 16:26:14 +040012var exposed = `
gio842db3f2025-05-30 11:57:20 +040013input: {
14 key: {
15 private: "asd"
16 public: "qwe"
17 }
18}
giofc441e32024-11-11 16:26:14 +040019service: [{
20 name: "app"
gio561724f2024-11-04 08:37:34 +040021 type: "golang:1.20.0"
22 run: "main.go"
gio4fa7eb32025-04-16 17:23:06 +040023 ingress: [{
gio561724f2024-11-04 08:37:34 +040024 network: "private"
25 subdomain: "testapp"
26 auth: enabled: false
giob6359422025-06-18 13:35:09 +040027 port: name: "web"
gio4fa7eb32025-04-16 17:23:06 +040028 }]
giofc441e32024-11-11 16:26:14 +040029 source: repository: "ssh://foo.bar"
30 ports: [{
31 name: "a"
32 value: 100
33 }, {
34 name: "web"
35 value: 8080
36 }, {
37 name: "b"
38 value: 101
39 }]
40 expose: [{
41 network: "private"
42 subdomain: "1"
43 port: value: 100
44 }, {
45 network: "public"
46 subdomain:"2"
47 port: name: "web"
48 }, {
49 network: "private"
50 subdomain: "3"
51 port: value: 101
gioa1f29472025-05-14 13:05:05 +040052 }],
53 dev: enabled: false
giofc441e32024-11-11 16:26:14 +040054}]
gio561724f2024-11-04 08:37:34 +040055
56postgresql: [{
57 name: "db_1"
giofc441e32024-11-11 16:26:14 +040058 expose: [{
59 network: "private"
60 subdomain: "1"
61 }, {
62 network: "public"
63 subdomain:"2"
64 }, {
65 network: "private"
66 subdomain: "3"
67 }]
gio561724f2024-11-04 08:37:34 +040068}, {
69 name: "db_2"
giofc441e32024-11-11 16:26:14 +040070 expose: [{
71 network: "public"
72 subdomain: "1"
73 }, {
74 network: "private"
75 subdomain:"2"
76 }, {
77 network: "public"
78 subdomain: "3"
79 }]
80}]
gio561724f2024-11-04 08:37:34 +040081
giofc441e32024-11-11 16:26:14 +040082mongodb: [{
83 name: "mdb_1"
84 expose: [{
85 network: "public"
86 subdomain: "1"
87 }, {
88 network: "private"
89 subdomain:"2"
90 }, {
91 network: "public"
92 subdomain: "3"
93 }]
94}, {
95 name: "mdb_2"
96 expose: [{
97 network: "private"
98 subdomain: "1"
99 }, {
100 network: "public"
101 subdomain:"2"
102 }, {
103 network: "private"
104 subdomain: "3"
105 }]
106}]
107`
108
109func TestExposedPorts(t *testing.T) {
110 app, err := NewDodoApp([]byte(exposed))
gio561724f2024-11-04 08:37:34 +0400111 if err != nil {
112 for _, e := range errors.Errors(err) {
113 t.Log(e)
114 }
115 t.Fatal(err)
116 }
gio561724f2024-11-04 08:37:34 +0400117 release := Release{
118 Namespace: "foo",
119 AppInstanceId: "foo-bar",
120 RepoAddr: "ssh://192.168.100.210:22/config",
121 AppDir: "/foo/bar",
122 }
123 keyGen := testKeyGen{}
124 r, err := app.Render(release, env, networks, nil, map[string]any{
giofc441e32024-11-11 16:26:14 +0400125 "managerAddr": "",
126 "appId": "",
127 "sshPrivateKey": "",
128 "port_postgresql_db_1_0": 1,
129 "port_postgresql_db_1_1": 2,
130 "port_postgresql_db_1_2": 3,
131 "port_postgresql_db_2_0": 4,
132 "port_postgresql_db_2_1": 5,
133 "port_postgresql_db_2_2": 6,
134 "port_mongodb_mdb_1_0": 1,
135 "port_mongodb_mdb_1_1": 2,
136 "port_mongodb_mdb_1_2": 3,
137 "port_mongodb_mdb_2_0": 4,
138 "port_mongodb_mdb_2_1": 5,
139 "port_mongodb_mdb_2_2": 6,
140 "port_service_app_0": 7,
141 "port_service_app_1": 8,
142 "port_service_app_2": 9,
gio561724f2024-11-04 08:37:34 +0400143 }, nil, keyGen)
144 if err != nil {
giofc441e32024-11-11 16:26:14 +0400145 t.Fatal(err)
146 }
147 t.Log(string(r.Raw))
148}
149
150const canvas = `
151{
gioe10ba162025-07-31 19:52:29 +0400152 "service": [
153 {
154 "type": "nextjs:deno-2.0.0",
155 "name": "app",
156 "source": {
157 "repository": "ssh://d.p.v1.dodo.cloud:62533/myblog",
158 "branch": "master",
159 "rootDir": "/"
160 },
161 "ports": [
giofc441e32024-11-11 16:26:14 +0400162 {
gioe10ba162025-07-31 19:52:29 +0400163 "name": "web",
164 "value": 3000,
165 "protocol": "TCP"
giofc441e32024-11-11 16:26:14 +0400166 }
gioe10ba162025-07-31 19:52:29 +0400167 ],
168 "env": [
giofc441e32024-11-11 16:26:14 +0400169 {
gioe10ba162025-07-31 19:52:29 +0400170 "name": "DODO_POSTGRESQL_DB_CONNECTION_URL"
giofc441e32024-11-11 16:26:14 +0400171 }
gioe10ba162025-07-31 19:52:29 +0400172 ],
173 "ingress": [
174 {
175 "network": "Private",
176 "subdomain": "foo",
177 "port": {
178 "name": "web"
179 },
180 "auth": {
181 "enabled": false
182 }
183 },
184 {
185 "network": "Public",
186 "subdomain": "foo",
187 "port": {
188 "name": "web"
189 },
190 "auth": {
191 "enabled": false
192 }
193 }
194 ],
195 "expose": [],
196 "dev": {
197 "enabled": true,
198 "mode": "VM",
199 "username": "gio"
200 }
201 }
202 ],
203 "volume": [],
204 "postgresql": [
205 {
206 "name": "db",
207 "size": "1Gi",
208 "expose": []
209 }
210 ],
211 "mongodb": []
giofc441e32024-11-11 16:26:14 +0400212}
213`
214
215func TestCanvas(t *testing.T) {
216 app, err := NewDodoApp([]byte(canvas))
217 if err != nil {
gio561724f2024-11-04 08:37:34 +0400218 for _, e := range errors.Errors(err) {
giofc441e32024-11-11 16:26:14 +0400219 t.Log(e)
gio561724f2024-11-04 08:37:34 +0400220 }
221 t.Fatal(err)
222 }
giofc441e32024-11-11 16:26:14 +0400223 release := Release{
224 Namespace: "foo",
225 AppInstanceId: "foo-bar",
226 RepoAddr: "ssh://192.168.100.210:22/config",
227 AppDir: "/foo/bar",
228 }
229 keyGen := testKeyGen{}
230 r, err := app.Render(release, env, networks, nil, map[string]any{
231 "managerAddr": "",
232 "appId": "",
233 "sshPrivateKey": "",
234 }, nil, keyGen)
235 if err != nil {
236 t.Fatal(err)
237 }
gio561724f2024-11-04 08:37:34 +0400238 t.Log(string(r.Raw))
239}
gio721c0042025-04-03 11:56:36 +0400240
giof4344632025-04-08 20:04:35 +0400241const exposeRemoteClusterPrivateNetwork = `
gio721c0042025-04-03 11:56:36 +0400242{
243 "cluster": "remote",
244 "postgresql": [{
245 "name": "db",
246 "size": "1Gi",
247 "expose": [{
248 "network": "Private",
249 "subdomain": "pg"
250 }]
251 }],
252}
253`
254
giof4344632025-04-08 20:04:35 +0400255func TestExposeRemoteClusterPrivateNetwork(t *testing.T) {
gio721c0042025-04-03 11:56:36 +0400256 var buf bytes.Buffer
giof4344632025-04-08 20:04:35 +0400257 if _, err := buf.WriteString(exposeRemoteClusterPrivateNetwork); err != nil {
gio721c0042025-04-03 11:56:36 +0400258 t.Fatal(err)
259 }
260 clusters := []Cluster{{
261 Name: "remote",
262 Kubeconfig: "<KUBECONFIG>",
263 IngressClassName: "<INGRESS_CLASS_NAME>",
264 }}
265 if err := json.NewEncoder(&buf).Encode(struct {
266 Clusters []Cluster `json:"clusters"`
267 }{
268 clusters,
269 }); err != nil {
270 t.Fatal(err)
271 }
272 app, err := NewDodoApp(buf.Bytes())
273 if err != nil {
274 for _, e := range errors.Errors(err) {
275 t.Log(e)
276 }
277 t.Fatal(err)
278 }
279 release := Release{
280 Namespace: "foo",
281 AppInstanceId: "foo-bar",
282 RepoAddr: "ssh://192.168.100.210:22/config",
283 AppDir: "/foo/bar",
284 }
285 keyGen := testKeyGen{}
286 r, err := app.Render(release, env, networks, clusters, map[string]any{
287 "managerAddr": "",
288 "appId": "",
289 "sshPrivateKey": "",
290 "port_postgresql_db_0": 1,
291 "port_postgresql_db_0_cluster": 2,
292 }, nil, keyGen)
293 if err != nil {
294 t.Fatal(err)
295 }
296 t.Log(string(r.Raw))
giod78896a2025-04-10 07:42:13 +0400297 t.Log(fmt.Sprintf("%+v", r.Ports))
gio721c0042025-04-03 11:56:36 +0400298}
giof4344632025-04-08 20:04:35 +0400299
300const exposeRemoteClusterPublicNetwork = `
301{
302 "cluster": "remote",
303 "postgresql": [{
304 "name": "db",
305 "size": "1Gi",
306 "expose": [{
307 "network": "Public",
308 "subdomain": "pg"
309 }]
310 }],
311}
312`
313
314func TestExposeRemoteClusterPublicNetwork(t *testing.T) {
315 var buf bytes.Buffer
316 if _, err := buf.WriteString(exposeRemoteClusterPublicNetwork); err != nil {
317 t.Fatal(err)
318 }
319 clusters := []Cluster{{
320 Name: "remote",
321 Kubeconfig: "<KUBECONFIG>",
322 IngressClassName: "<INGRESS_CLASS_NAME>",
323 }}
324 if err := json.NewEncoder(&buf).Encode(struct {
325 Clusters []Cluster `json:"clusters"`
326 }{
327 clusters,
328 }); err != nil {
329 t.Fatal(err)
330 }
331 app, err := NewDodoApp(buf.Bytes())
332 if err != nil {
333 for _, e := range errors.Errors(err) {
334 t.Log(e)
335 }
336 t.Fatal(err)
337 }
338 release := Release{
339 Namespace: "foo",
340 AppInstanceId: "foo-bar",
341 RepoAddr: "ssh://192.168.100.210:22/config",
342 AppDir: "/foo/bar",
343 }
344 keyGen := testKeyGen{}
345 r, err := app.Render(release, env, networks, clusters, map[string]any{
346 "managerAddr": "",
347 "appId": "",
348 "sshPrivateKey": "",
349 "port_postgresql_db_0": 1,
350 "port_postgresql_db_0_cluster": 2,
351 "port_postgresql_db_0_private": 3,
352 }, nil, keyGen)
353 if err != nil {
354 t.Fatal(err)
355 }
356 t.Log(string(r.Raw))
357}
giof55ab362025-04-11 17:48:17 +0400358
359const exposeSVCRemoteCluster = `
360{
gioa1f29472025-05-14 13:05:05 +0400361 "cluster": "remote",
362 "service": [
363 {
364 "name": "echo",
365 "type": "golang:1.20.0",
366 "source": {
367 "repository": "ssh://foo.bar"
368 },
369 "ports": [
370 {
371 "name": "echo",
372 "value": 9090
373 }
374 ],
375 "expose": [
376 {
377 "port": {
378 "name": "echo"
379 },
380 "network": "Private",
381 "subdomain": "echo"
382 }
383 ],
384 "dev": {
385 "enabled": false
386 }
387 }
388 ]
giof55ab362025-04-11 17:48:17 +0400389}
390`
391
392func TestExposeSVCRemoteCluster(t *testing.T) {
393 var buf bytes.Buffer
394 if _, err := buf.WriteString(exposeSVCRemoteCluster); err != nil {
395 t.Fatal(err)
396 }
397 clusters := []Cluster{{
398 Name: "remote",
399 Kubeconfig: "<KUBECONFIG>",
400 IngressClassName: "<INGRESS_CLASS_NAME>",
401 }}
402 if err := json.NewEncoder(&buf).Encode(struct {
403 Clusters []Cluster `json:"clusters"`
404 }{
405 clusters,
406 }); err != nil {
407 t.Fatal(err)
408 }
409 app, err := NewDodoApp(buf.Bytes())
410 if err != nil {
411 for _, e := range errors.Errors(err) {
412 t.Log(e)
413 }
414 t.Fatal(err)
415 }
416 release := Release{
417 Namespace: "foo",
418 AppInstanceId: "foo-bar",
419 RepoAddr: "ssh://192.168.100.210:22/config",
420 AppDir: "/foo/bar",
421 }
422 keyGen := testKeyGen{}
423 r, err := app.Render(release, env, networks, clusters, map[string]any{
424 "managerAddr": "",
425 "appId": "",
426 "sshPrivateKey": "",
427 "port_service_echo_0": 1,
428 "port_service_echo_0_cluster": 2,
429 }, nil, keyGen)
430 if err != nil {
431 t.Fatal(err)
432 }
433 t.Log(string(r.Raw))
434 t.Log(fmt.Sprintf("%+v", r.Ports))
435}
gioa1f29472025-05-14 13:05:05 +0400436
437const sshCodeServer = `
438{
439 "service": [
440 {
441 "type": "nextjs:deno-2.0.0",
442 "name": "app",
443 "source": {
444 "repository": "ssh://d.p.v1.dodo.cloud:62533/myblog",
445 "branch": "master",
446 "rootDir": "/"
447 },
448 "ports": [
449 {
450 "name": "web",
451 "value": 3000,
452 "protocol": "TCP"
453 }
454 ],
455 "env": [
456 {
457 "name": "DODO_POSTGRESQL_DB_CONNECTION_URL"
458 }
459 ],
460 "ingress": [
461 {
462 "network": "Private",
463 "subdomain": "foo",
464 "port": {
465 "name": "web"
466 },
467 "auth": {
468 "enabled": false
469 }
470 },
471 {
472 "network": "Public",
473 "subdomain": "foo",
474 "port": {
475 "name": "web"
476 },
477 "auth": {
478 "enabled": false
479 }
480 }
481 ],
482 "expose": [{
483 "network": "Public",
484 "subdomain": "foo",
485 "port": {
486 "name": "web"
487 },
488 }],
489 "dev": {
490 "enabled": true,
gioe10ba162025-07-31 19:52:29 +0400491 "mode": "VM",
gioa1f29472025-05-14 13:05:05 +0400492 "username": "gio",
493 "codeServer": {
494 "network": "Private",
495 "subdomain": "code"
496 },
497 "ssh": {
498 "network": "Public",
499 "subdomain": "ssh"
500 }
501 }
502 }
503 ],
504 "volume": [],
505 "postgresql": [
506 {
507 "name": "db",
508 "size": "1Gi",
509 "expose": []
510 }
511 ],
512 "mongodb": []
513}
514`
515
516func TestSSHCodeServer(t *testing.T) {
517 app, err := NewDodoApp([]byte(sshCodeServer))
518 if err != nil {
519 for _, e := range errors.Errors(err) {
520 t.Log(e)
521 }
522 t.Fatal(err)
523 }
524 release := Release{
525 Namespace: "foo",
526 AppInstanceId: "foo-bar",
527 RepoAddr: "ssh://192.168.100.210:22/config",
528 AppDir: "/foo/bar",
529 }
530 keyGen := testKeyGen{}
531 r, err := app.Render(release, env, networks, nil, map[string]any{
532 "managerAddr": "",
533 "appId": "",
534 "sshPrivateKey": "",
535 "port_service_app_ssh": 12,
536 "port_service_app_0": 13,
537 }, nil, keyGen)
538 if err != nil {
539 t.Fatal(err)
540 }
541 t.Log(string(r.Raw))
542}
giob1d3bd72025-05-15 07:20:06 +0400543
544const foo = `
545{
gioe10ba162025-07-31 19:52:29 +0400546 "service": [
547 {
548 "type": "deno:2.2.0",
549 "name": "qwe",
550 "source": {
551 "repository": "git@github.com:giolekva/dodo-blog.git"
552 },
553 "ports": [
554 {
555 "name": "web",
556 "value": 8081,
557 "protocol": "TCP"
558 }
559 ],
560 "env": [
561 {
562 "name": "DODO_POSTGRESQL_DB_URL"
563 },
564 {
565 "name": "DODO_PORT_WEB"
566 }
567 ],
568 "ingress": [
569 {
570 "network": "Private",
571 "subdomain": "blog",
572 "port": {
573 "name": "web"
574 },
575 "auth": {
576 "enabled": false
577 }
578 }
579 ],
580 "expose": [
581 {
582 "network": "Private",
583 "subdomain": "blog",
584 "port": {
585 "name": "web"
586 }
587 }
588 ],
589 "preBuildCommands": [],
590 "dev": {
591 "enabled": true,
592 "mode": "PROXY",
593 "vpn": { "enabled": true, "username": "gio" },
gio59d7a822025-08-02 13:06:32 +0400594 "address": "65.108.39.172"
gioe10ba162025-07-31 19:52:29 +0400595 }
596 }
597 ],
598 "volume": [],
599 "postgresql": [],
600 "mongodb": []
giob1d3bd72025-05-15 07:20:06 +0400601}
602`
603
604func TestFoo(t *testing.T) {
605 app, err := NewDodoApp([]byte(foo))
606 if err != nil {
607 for _, e := range errors.Errors(err) {
608 t.Log(e)
609 }
610 t.Fatal(err)
611 }
612 release := Release{
613 Namespace: "foo",
614 AppInstanceId: "foo-bar",
615 RepoAddr: "ssh://192.168.100.210:22/config",
616 AppDir: "/foo/bar",
617 }
618 keyGen := testKeyGen{}
619 r, err := app.Render(release, env, networks, nil, map[string]any{
620 "managerAddr": "",
621 "appId": "",
622 "sshPrivateKey": "",
gio6ce44812025-05-17 07:31:54 +0400623 "port_service_qwe_ssh": 1,
624 "port_service_qwe_0": 2,
625 "port_postgresql_db_0": 3,
giob1d3bd72025-05-15 07:20:06 +0400626 }, nil, keyGen)
627 if err != nil {
628 t.Fatal(err)
629 }
gioe10ba162025-07-31 19:52:29 +0400630 t.Log(string(r.Raw))
giob1d3bd72025-05-15 07:20:06 +0400631}
gioe65d9a92025-06-19 09:02:32 +0400632
633const sketch = `
634{
gio7f293f32025-06-24 09:03:46 +0400635 "agent": [
636 {
637 "type": "sketch:latest",
638 "name": "dev",
gio4745b3f2025-07-03 10:29:09 +0400639 "model": {
640 "name": "gemini",
641 "geminiApiKey": "foo"
642 },
gio379ff062025-06-24 13:09:47 +0400643 "ingress": [{
644 "network": "private",
645 "subdomain": "foo",
646 "port": {
647 "name": "agent"
648 }
649 }],
gio7f293f32025-06-24 09:03:46 +0400650 "ports": [
gioe65d9a92025-06-19 09:02:32 +0400651 {
gio7f293f32025-06-24 09:03:46 +0400652 "name": "agent",
653 "value": 2001,
654 "protocol": "TCP"
655 },
656 {
657 "name": "p8080",
658 "value": 8080,
659 "protocol": "TCP"
660 },
661 {
662 "name": "p8081",
663 "value": 8081,
664 "protocol": "TCP"
665 },
666 {
667 "name": "p8082",
668 "value": 8082,
669 "protocol": "TCP"
670 },
671 {
672 "name": "p8083",
673 "value": 8083,
674 "protocol": "TCP"
675 },
676 {
677 "name": "p8084",
678 "value": 8084,
679 "protocol": "TCP"
gioe65d9a92025-06-19 09:02:32 +0400680 }
gio7f293f32025-06-24 09:03:46 +0400681 ]
682 }
683 ]
gioe65d9a92025-06-19 09:02:32 +0400684}
685`
686
687func TestSketch(t *testing.T) {
688 app, err := NewDodoApp([]byte(sketch))
689 if err != nil {
690 for _, e := range errors.Errors(err) {
691 t.Log(e)
692 }
693 t.Fatal(err)
694 }
695 release := Release{
696 Namespace: "foo",
697 AppInstanceId: "foo-bar",
698 RepoAddr: "ssh://192.168.100.210:22/config",
699 AppDir: "/foo/bar",
700 }
701 keyGen := testKeyGen{}
702 r, err := app.Render(release, env, networks, nil, map[string]any{
703 "managerAddr": "",
704 "appId": "",
705 "geminiApiKey": "dev",
706 }, nil, keyGen)
707 if err != nil {
708 t.Fatal(err)
709 }
710 t.Log(string(r.Raw))
711}
712
713const sketchGlobalGeminiApiKey = `
714{
715 "agent": [
716 {
717 "type": "sketch:latest",
718 "name": "dev",
gio4745b3f2025-07-03 10:29:09 +0400719 "model": {
720 "name": "gemini"
721 }
gioe65d9a92025-06-19 09:02:32 +0400722 }
gio4745b3f2025-07-03 10:29:09 +0400723 ]
gioe65d9a92025-06-19 09:02:32 +0400724}
725`
726
727func TestSketchGlobalGeminiApiKey(t *testing.T) {
728 app, err := NewDodoApp([]byte(sketchGlobalGeminiApiKey))
729 if err != nil {
730 for _, e := range errors.Errors(err) {
731 t.Log(e)
732 }
733 t.Fatal(err)
734 }
735 release := Release{
736 Namespace: "foo",
737 AppInstanceId: "foo-bar",
738 RepoAddr: "ssh://192.168.100.210:22/config",
739 AppDir: "/foo/bar",
740 }
741 keyGen := testKeyGen{}
742 r, err := app.Render(release, env, networks, nil, map[string]any{
743 "managerAddr": "",
744 "appId": "",
745 "geminiApiKey": "dev",
746 }, nil, keyGen)
747 if err != nil {
748 t.Fatal(err)
749 }
750 t.Log(string(r.Raw))
751}
gio3aba3092025-07-02 18:49:44 +0400752
753const serviceAndAgent = `
754{
755 "service": [
756 {
757 "nodeId": "02efbce4-c338-4cb9-a101-63acfeaca4c7",
758 "type": "deno:2.2.0",
759 "name": "blog",
760 "source": {
761 "repository": "git@github.com:giolekva/dodo-blog.git",
762 "branch": "master",
763 "rootDir": "/"
764 },
765 "ports": [
766 {
767 "name": "web",
768 "value": 8080,
769 "protocol": "TCP"
770 }
771 ],
772 "env": [
773 {
774 "name": "DODO_POSTGRESQL_DB_URL"
775 },
776 {
777 "name": "DODO_PORT_WEB",
778 "alias": "PORT"
779 }
780 ],
781 "ingress": [
782 {
783 "nodeId": "bb4c754a-d50b-4686-b485-17ad1804f014",
784 "network": "Private",
785 "subdomain": "blog",
786 "port": {
787 "name": "web"
788 },
789 "auth": {
790 "enabled": false
791 }
792 }
793 ],
794 "expose": [],
795 "preBuildCommands": [
796 {
797 "bin": "deno run -A npm:prisma migrate dev"
798 }
799 ],
800 "dev": {
801 "enabled": false
802 }
803 }
804 ],
805 "agent": [
806 {
807 "nodeId": "76081511-fa20-4202-935a-a171c79a9daf",
808 "type": "sketch:latest",
809 "name": "lead",
gio4745b3f2025-07-03 10:29:09 +0400810 "model": {
811 "name": "gemini"
812 },
gio3aba3092025-07-02 18:49:44 +0400813 "ports": [
814 {
815 "name": "agent",
816 "value": 2001,
817 "protocol": "TCP"
818 },
819 {
820 "name": "p8080",
821 "value": 8080,
822 "protocol": "TCP"
823 },
824 {
825 "name": "p8081",
826 "value": 8081,
827 "protocol": "TCP"
828 },
829 {
830 "name": "p8082",
831 "value": 8082,
832 "protocol": "TCP"
833 },
834 {
835 "name": "p8083",
836 "value": 8083,
837 "protocol": "TCP"
838 },
839 {
840 "name": "p8084",
841 "value": 8084,
842 "protocol": "TCP"
843 }
844 ],
845 "env": [
846 {
847 "name": "DODO_PORT_AGENT"
848 },
849 {
850 "name": "DODO_PORT_P8080"
851 },
852 {
853 "name": "DODO_PORT_P8081"
854 },
855 {
856 "name": "DODO_PORT_P8082"
857 },
858 {
859 "name": "DODO_PORT_P8083"
860 },
861 {
862 "name": "DODO_PORT_P8084"
863 }
864 ],
865 "ingress": [
866 {
867 "nodeId": "31cadf3f-0858-4a86-844b-733910817984",
868 "network": "Private",
869 "subdomain": "weq",
870 "port": {
871 "name": "agent"
872 },
873 "auth": {
874 "enabled": false
875 }
876 }
877 ],
878 "expose": [],
879 "preBuildCommands": [],
880 "dev": {
881 "enabled": false
882 }
883 }
884 ],
885 "volume": [],
886 "postgresql": [
887 {
888 "nodeId": "ba62db4b-2b07-49d0-ba29-ab65bd244997",
889 "name": "db",
890 "size": "1Gi",
891 "expose": []
892 }
893 ],
894 "mongodb": []
895}
896`
897
898func TestServiceAndAgent(t *testing.T) {
899 app, err := NewDodoApp([]byte(serviceAndAgent))
900 if err != nil {
901 for _, e := range errors.Errors(err) {
902 t.Log(e)
903 }
904 t.Fatal(err)
905 }
906 release := Release{
907 Namespace: "foo",
908 AppInstanceId: "foo-bar",
909 RepoAddr: "ssh://192.168.100.210:22/config",
910 AppDir: "/foo/bar",
911 }
912 keyGen := testKeyGen{}
913 r, err := app.Render(release, env, networks, nil, map[string]any{
914 "managerAddr": "",
915 "appId": "",
916 "geminiApiKey": "dev",
917 }, nil, keyGen)
918 if err != nil {
919 t.Fatal(err)
920 }
921 t.Log(string(r.Raw))
922}