blob: 73f7025bde50debf937b26b095df4dbd65c7bea8 [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" },
594 "address": "65.108.39.172",
595 "ports": [
596 {
597 "src": 8081,
598 "dst": 80
599 }
600 ]
601 }
602 }
603 ],
604 "volume": [],
605 "postgresql": [],
606 "mongodb": []
giob1d3bd72025-05-15 07:20:06 +0400607}
608`
609
610func TestFoo(t *testing.T) {
611 app, err := NewDodoApp([]byte(foo))
612 if err != nil {
613 for _, e := range errors.Errors(err) {
614 t.Log(e)
615 }
616 t.Fatal(err)
617 }
618 release := Release{
619 Namespace: "foo",
620 AppInstanceId: "foo-bar",
621 RepoAddr: "ssh://192.168.100.210:22/config",
622 AppDir: "/foo/bar",
623 }
624 keyGen := testKeyGen{}
625 r, err := app.Render(release, env, networks, nil, map[string]any{
626 "managerAddr": "",
627 "appId": "",
628 "sshPrivateKey": "",
gio6ce44812025-05-17 07:31:54 +0400629 "port_service_qwe_ssh": 1,
630 "port_service_qwe_0": 2,
631 "port_postgresql_db_0": 3,
giob1d3bd72025-05-15 07:20:06 +0400632 }, nil, keyGen)
633 if err != nil {
634 t.Fatal(err)
635 }
gioe10ba162025-07-31 19:52:29 +0400636 t.Log(string(r.Raw))
giob1d3bd72025-05-15 07:20:06 +0400637}
gioe65d9a92025-06-19 09:02:32 +0400638
639const sketch = `
640{
gio7f293f32025-06-24 09:03:46 +0400641 "agent": [
642 {
643 "type": "sketch:latest",
644 "name": "dev",
gio4745b3f2025-07-03 10:29:09 +0400645 "model": {
646 "name": "gemini",
647 "geminiApiKey": "foo"
648 },
gio379ff062025-06-24 13:09:47 +0400649 "ingress": [{
650 "network": "private",
651 "subdomain": "foo",
652 "port": {
653 "name": "agent"
654 }
655 }],
gio7f293f32025-06-24 09:03:46 +0400656 "ports": [
gioe65d9a92025-06-19 09:02:32 +0400657 {
gio7f293f32025-06-24 09:03:46 +0400658 "name": "agent",
659 "value": 2001,
660 "protocol": "TCP"
661 },
662 {
663 "name": "p8080",
664 "value": 8080,
665 "protocol": "TCP"
666 },
667 {
668 "name": "p8081",
669 "value": 8081,
670 "protocol": "TCP"
671 },
672 {
673 "name": "p8082",
674 "value": 8082,
675 "protocol": "TCP"
676 },
677 {
678 "name": "p8083",
679 "value": 8083,
680 "protocol": "TCP"
681 },
682 {
683 "name": "p8084",
684 "value": 8084,
685 "protocol": "TCP"
gioe65d9a92025-06-19 09:02:32 +0400686 }
gio7f293f32025-06-24 09:03:46 +0400687 ]
688 }
689 ]
gioe65d9a92025-06-19 09:02:32 +0400690}
691`
692
693func TestSketch(t *testing.T) {
694 app, err := NewDodoApp([]byte(sketch))
695 if err != nil {
696 for _, e := range errors.Errors(err) {
697 t.Log(e)
698 }
699 t.Fatal(err)
700 }
701 release := Release{
702 Namespace: "foo",
703 AppInstanceId: "foo-bar",
704 RepoAddr: "ssh://192.168.100.210:22/config",
705 AppDir: "/foo/bar",
706 }
707 keyGen := testKeyGen{}
708 r, err := app.Render(release, env, networks, nil, map[string]any{
709 "managerAddr": "",
710 "appId": "",
711 "geminiApiKey": "dev",
712 }, nil, keyGen)
713 if err != nil {
714 t.Fatal(err)
715 }
716 t.Log(string(r.Raw))
717}
718
719const sketchGlobalGeminiApiKey = `
720{
721 "agent": [
722 {
723 "type": "sketch:latest",
724 "name": "dev",
gio4745b3f2025-07-03 10:29:09 +0400725 "model": {
726 "name": "gemini"
727 }
gioe65d9a92025-06-19 09:02:32 +0400728 }
gio4745b3f2025-07-03 10:29:09 +0400729 ]
gioe65d9a92025-06-19 09:02:32 +0400730}
731`
732
733func TestSketchGlobalGeminiApiKey(t *testing.T) {
734 app, err := NewDodoApp([]byte(sketchGlobalGeminiApiKey))
735 if err != nil {
736 for _, e := range errors.Errors(err) {
737 t.Log(e)
738 }
739 t.Fatal(err)
740 }
741 release := Release{
742 Namespace: "foo",
743 AppInstanceId: "foo-bar",
744 RepoAddr: "ssh://192.168.100.210:22/config",
745 AppDir: "/foo/bar",
746 }
747 keyGen := testKeyGen{}
748 r, err := app.Render(release, env, networks, nil, map[string]any{
749 "managerAddr": "",
750 "appId": "",
751 "geminiApiKey": "dev",
752 }, nil, keyGen)
753 if err != nil {
754 t.Fatal(err)
755 }
756 t.Log(string(r.Raw))
757}
gio3aba3092025-07-02 18:49:44 +0400758
759const serviceAndAgent = `
760{
761 "service": [
762 {
763 "nodeId": "02efbce4-c338-4cb9-a101-63acfeaca4c7",
764 "type": "deno:2.2.0",
765 "name": "blog",
766 "source": {
767 "repository": "git@github.com:giolekva/dodo-blog.git",
768 "branch": "master",
769 "rootDir": "/"
770 },
771 "ports": [
772 {
773 "name": "web",
774 "value": 8080,
775 "protocol": "TCP"
776 }
777 ],
778 "env": [
779 {
780 "name": "DODO_POSTGRESQL_DB_URL"
781 },
782 {
783 "name": "DODO_PORT_WEB",
784 "alias": "PORT"
785 }
786 ],
787 "ingress": [
788 {
789 "nodeId": "bb4c754a-d50b-4686-b485-17ad1804f014",
790 "network": "Private",
791 "subdomain": "blog",
792 "port": {
793 "name": "web"
794 },
795 "auth": {
796 "enabled": false
797 }
798 }
799 ],
800 "expose": [],
801 "preBuildCommands": [
802 {
803 "bin": "deno run -A npm:prisma migrate dev"
804 }
805 ],
806 "dev": {
807 "enabled": false
808 }
809 }
810 ],
811 "agent": [
812 {
813 "nodeId": "76081511-fa20-4202-935a-a171c79a9daf",
814 "type": "sketch:latest",
815 "name": "lead",
gio4745b3f2025-07-03 10:29:09 +0400816 "model": {
817 "name": "gemini"
818 },
gio3aba3092025-07-02 18:49:44 +0400819 "ports": [
820 {
821 "name": "agent",
822 "value": 2001,
823 "protocol": "TCP"
824 },
825 {
826 "name": "p8080",
827 "value": 8080,
828 "protocol": "TCP"
829 },
830 {
831 "name": "p8081",
832 "value": 8081,
833 "protocol": "TCP"
834 },
835 {
836 "name": "p8082",
837 "value": 8082,
838 "protocol": "TCP"
839 },
840 {
841 "name": "p8083",
842 "value": 8083,
843 "protocol": "TCP"
844 },
845 {
846 "name": "p8084",
847 "value": 8084,
848 "protocol": "TCP"
849 }
850 ],
851 "env": [
852 {
853 "name": "DODO_PORT_AGENT"
854 },
855 {
856 "name": "DODO_PORT_P8080"
857 },
858 {
859 "name": "DODO_PORT_P8081"
860 },
861 {
862 "name": "DODO_PORT_P8082"
863 },
864 {
865 "name": "DODO_PORT_P8083"
866 },
867 {
868 "name": "DODO_PORT_P8084"
869 }
870 ],
871 "ingress": [
872 {
873 "nodeId": "31cadf3f-0858-4a86-844b-733910817984",
874 "network": "Private",
875 "subdomain": "weq",
876 "port": {
877 "name": "agent"
878 },
879 "auth": {
880 "enabled": false
881 }
882 }
883 ],
884 "expose": [],
885 "preBuildCommands": [],
886 "dev": {
887 "enabled": false
888 }
889 }
890 ],
891 "volume": [],
892 "postgresql": [
893 {
894 "nodeId": "ba62db4b-2b07-49d0-ba29-ab65bd244997",
895 "name": "db",
896 "size": "1Gi",
897 "expose": []
898 }
899 ],
900 "mongodb": []
901}
902`
903
904func TestServiceAndAgent(t *testing.T) {
905 app, err := NewDodoApp([]byte(serviceAndAgent))
906 if err != nil {
907 for _, e := range errors.Errors(err) {
908 t.Log(e)
909 }
910 t.Fatal(err)
911 }
912 release := Release{
913 Namespace: "foo",
914 AppInstanceId: "foo-bar",
915 RepoAddr: "ssh://192.168.100.210:22/config",
916 AppDir: "/foo/bar",
917 }
918 keyGen := testKeyGen{}
919 r, err := app.Render(release, env, networks, nil, map[string]any{
920 "managerAddr": "",
921 "appId": "",
922 "geminiApiKey": "dev",
923 }, nil, keyGen)
924 if err != nil {
925 t.Fatal(err)
926 }
927 t.Log(string(r.Raw))
928}