blob: 3501620bc83452d0f20ead009457c34db3951b55 [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 = `
13service: [{
14 name: "app"
gio561724f2024-11-04 08:37:34 +040015 type: "golang:1.20.0"
16 run: "main.go"
gio4fa7eb32025-04-16 17:23:06 +040017 ingress: [{
gio561724f2024-11-04 08:37:34 +040018 network: "private"
19 subdomain: "testapp"
20 auth: enabled: false
gio4fa7eb32025-04-16 17:23:06 +040021 }]
giofc441e32024-11-11 16:26:14 +040022 source: repository: "ssh://foo.bar"
23 ports: [{
24 name: "a"
25 value: 100
26 }, {
27 name: "web"
28 value: 8080
29 }, {
30 name: "b"
31 value: 101
32 }]
33 expose: [{
34 network: "private"
35 subdomain: "1"
36 port: value: 100
37 }, {
38 network: "public"
39 subdomain:"2"
40 port: name: "web"
41 }, {
42 network: "private"
43 subdomain: "3"
44 port: value: 101
45 }]
46}]
gio561724f2024-11-04 08:37:34 +040047
48postgresql: [{
49 name: "db_1"
giofc441e32024-11-11 16:26:14 +040050 expose: [{
51 network: "private"
52 subdomain: "1"
53 }, {
54 network: "public"
55 subdomain:"2"
56 }, {
57 network: "private"
58 subdomain: "3"
59 }]
gio561724f2024-11-04 08:37:34 +040060}, {
61 name: "db_2"
giofc441e32024-11-11 16:26:14 +040062 expose: [{
63 network: "public"
64 subdomain: "1"
65 }, {
66 network: "private"
67 subdomain:"2"
68 }, {
69 network: "public"
70 subdomain: "3"
71 }]
72}]
gio561724f2024-11-04 08:37:34 +040073
giofc441e32024-11-11 16:26:14 +040074mongodb: [{
75 name: "mdb_1"
76 expose: [{
77 network: "public"
78 subdomain: "1"
79 }, {
80 network: "private"
81 subdomain:"2"
82 }, {
83 network: "public"
84 subdomain: "3"
85 }]
86}, {
87 name: "mdb_2"
88 expose: [{
89 network: "private"
90 subdomain: "1"
91 }, {
92 network: "public"
93 subdomain:"2"
94 }, {
95 network: "private"
96 subdomain: "3"
97 }]
98}]
99`
100
101func TestExposedPorts(t *testing.T) {
102 app, err := NewDodoApp([]byte(exposed))
gio561724f2024-11-04 08:37:34 +0400103 if err != nil {
104 for _, e := range errors.Errors(err) {
105 t.Log(e)
106 }
107 t.Fatal(err)
108 }
gio561724f2024-11-04 08:37:34 +0400109 release := Release{
110 Namespace: "foo",
111 AppInstanceId: "foo-bar",
112 RepoAddr: "ssh://192.168.100.210:22/config",
113 AppDir: "/foo/bar",
114 }
115 keyGen := testKeyGen{}
116 r, err := app.Render(release, env, networks, nil, map[string]any{
giofc441e32024-11-11 16:26:14 +0400117 "managerAddr": "",
118 "appId": "",
119 "sshPrivateKey": "",
120 "port_postgresql_db_1_0": 1,
121 "port_postgresql_db_1_1": 2,
122 "port_postgresql_db_1_2": 3,
123 "port_postgresql_db_2_0": 4,
124 "port_postgresql_db_2_1": 5,
125 "port_postgresql_db_2_2": 6,
126 "port_mongodb_mdb_1_0": 1,
127 "port_mongodb_mdb_1_1": 2,
128 "port_mongodb_mdb_1_2": 3,
129 "port_mongodb_mdb_2_0": 4,
130 "port_mongodb_mdb_2_1": 5,
131 "port_mongodb_mdb_2_2": 6,
132 "port_service_app_0": 7,
133 "port_service_app_1": 8,
134 "port_service_app_2": 9,
gio561724f2024-11-04 08:37:34 +0400135 }, nil, keyGen)
136 if err != nil {
giofc441e32024-11-11 16:26:14 +0400137 t.Fatal(err)
138 }
139 t.Log(string(r.Raw))
140}
141
142const canvas = `
143{
144 "service": [
145 {
146 "type": "nextjs:deno-2.0.0",
147 "name": "app",
148 "source": {
149 "repository": "ssh://d.p.v1.dodo.cloud:62533/myblog",
150 "branch": "master",
151 "rootDir": "/"
152 },
153 "ports": [
154 {
155 "name": "web",
156 "value": 3000,
157 "protocol": "TCP"
158 }
159 ],
160 "env": [
161 {
162 "name": "DODO_POSTGRESQL_DB_CONNECTION_URL"
163 }
164 ],
gio4fa7eb32025-04-16 17:23:06 +0400165 "ingress": [{
giofc441e32024-11-11 16:26:14 +0400166 "network": "Private",
167 "subdomain": "foo",
168 "port": {
169 "name": "web"
170 },
171 "auth": {
172 "enabled": false
173 }
gio4fa7eb32025-04-16 17:23:06 +0400174 }, {
175 "network": "Public",
176 "subdomain": "foo",
177 "port": {
178 "name": "web"
179 },
180 "auth": {
181 "enabled": false
182 }
183 }],
giofc441e32024-11-11 16:26:14 +0400184 "expose": [],
185 "dev": { "enabled": true, "username": "gio" }
186 }
187 ],
188 "volume": [],
189 "postgresql": [
190 {
191 "name": "db",
192 "size": "1Gi",
193 "expose": []
194 }
195 ],
196 "mongodb": []
197}
198`
199
200func TestCanvas(t *testing.T) {
201 app, err := NewDodoApp([]byte(canvas))
202 if err != nil {
gio561724f2024-11-04 08:37:34 +0400203 for _, e := range errors.Errors(err) {
giofc441e32024-11-11 16:26:14 +0400204 t.Log(e)
gio561724f2024-11-04 08:37:34 +0400205 }
206 t.Fatal(err)
207 }
giofc441e32024-11-11 16:26:14 +0400208 release := Release{
209 Namespace: "foo",
210 AppInstanceId: "foo-bar",
211 RepoAddr: "ssh://192.168.100.210:22/config",
212 AppDir: "/foo/bar",
213 }
214 keyGen := testKeyGen{}
215 r, err := app.Render(release, env, networks, nil, map[string]any{
216 "managerAddr": "",
217 "appId": "",
218 "sshPrivateKey": "",
219 }, nil, keyGen)
220 if err != nil {
221 t.Fatal(err)
222 }
gio561724f2024-11-04 08:37:34 +0400223 t.Log(string(r.Raw))
224}
gio721c0042025-04-03 11:56:36 +0400225
giof4344632025-04-08 20:04:35 +0400226const exposeRemoteClusterPrivateNetwork = `
gio721c0042025-04-03 11:56:36 +0400227{
228 "cluster": "remote",
229 "postgresql": [{
230 "name": "db",
231 "size": "1Gi",
232 "expose": [{
233 "network": "Private",
234 "subdomain": "pg"
235 }]
236 }],
237}
238`
239
giof4344632025-04-08 20:04:35 +0400240func TestExposeRemoteClusterPrivateNetwork(t *testing.T) {
gio721c0042025-04-03 11:56:36 +0400241 var buf bytes.Buffer
giof4344632025-04-08 20:04:35 +0400242 if _, err := buf.WriteString(exposeRemoteClusterPrivateNetwork); err != nil {
gio721c0042025-04-03 11:56:36 +0400243 t.Fatal(err)
244 }
245 clusters := []Cluster{{
246 Name: "remote",
247 Kubeconfig: "<KUBECONFIG>",
248 IngressClassName: "<INGRESS_CLASS_NAME>",
249 }}
250 if err := json.NewEncoder(&buf).Encode(struct {
251 Clusters []Cluster `json:"clusters"`
252 }{
253 clusters,
254 }); err != nil {
255 t.Fatal(err)
256 }
257 app, err := NewDodoApp(buf.Bytes())
258 if err != nil {
259 for _, e := range errors.Errors(err) {
260 t.Log(e)
261 }
262 t.Fatal(err)
263 }
264 release := Release{
265 Namespace: "foo",
266 AppInstanceId: "foo-bar",
267 RepoAddr: "ssh://192.168.100.210:22/config",
268 AppDir: "/foo/bar",
269 }
270 keyGen := testKeyGen{}
271 r, err := app.Render(release, env, networks, clusters, map[string]any{
272 "managerAddr": "",
273 "appId": "",
274 "sshPrivateKey": "",
275 "port_postgresql_db_0": 1,
276 "port_postgresql_db_0_cluster": 2,
277 }, nil, keyGen)
278 if err != nil {
279 t.Fatal(err)
280 }
281 t.Log(string(r.Raw))
giod78896a2025-04-10 07:42:13 +0400282 t.Log(fmt.Sprintf("%+v", r.Ports))
gio721c0042025-04-03 11:56:36 +0400283}
giof4344632025-04-08 20:04:35 +0400284
285const exposeRemoteClusterPublicNetwork = `
286{
287 "cluster": "remote",
288 "postgresql": [{
289 "name": "db",
290 "size": "1Gi",
291 "expose": [{
292 "network": "Public",
293 "subdomain": "pg"
294 }]
295 }],
296}
297`
298
299func TestExposeRemoteClusterPublicNetwork(t *testing.T) {
300 var buf bytes.Buffer
301 if _, err := buf.WriteString(exposeRemoteClusterPublicNetwork); err != nil {
302 t.Fatal(err)
303 }
304 clusters := []Cluster{{
305 Name: "remote",
306 Kubeconfig: "<KUBECONFIG>",
307 IngressClassName: "<INGRESS_CLASS_NAME>",
308 }}
309 if err := json.NewEncoder(&buf).Encode(struct {
310 Clusters []Cluster `json:"clusters"`
311 }{
312 clusters,
313 }); err != nil {
314 t.Fatal(err)
315 }
316 app, err := NewDodoApp(buf.Bytes())
317 if err != nil {
318 for _, e := range errors.Errors(err) {
319 t.Log(e)
320 }
321 t.Fatal(err)
322 }
323 release := Release{
324 Namespace: "foo",
325 AppInstanceId: "foo-bar",
326 RepoAddr: "ssh://192.168.100.210:22/config",
327 AppDir: "/foo/bar",
328 }
329 keyGen := testKeyGen{}
330 r, err := app.Render(release, env, networks, clusters, map[string]any{
331 "managerAddr": "",
332 "appId": "",
333 "sshPrivateKey": "",
334 "port_postgresql_db_0": 1,
335 "port_postgresql_db_0_cluster": 2,
336 "port_postgresql_db_0_private": 3,
337 }, nil, keyGen)
338 if err != nil {
339 t.Fatal(err)
340 }
341 t.Log(string(r.Raw))
342}
giof55ab362025-04-11 17:48:17 +0400343
344const exposeSVCRemoteCluster = `
345{
346 "cluster": "remote",
347 "service": [{
348 "name": "echo",
349 "type": "golang:1.20.0",
350 "source": {
351 "repository": "ssh://foo.bar"
352 },
353 "ports": [{
354 "name": "echo",
355 "value": 9090
356 }],
357 "expose": [{
358 "port": {
359 "name": "echo"
360 },
361 "network": "Private",
362 "subdomain": "echo"
363 }]
364 }]
365}
366`
367
368func TestExposeSVCRemoteCluster(t *testing.T) {
369 var buf bytes.Buffer
370 if _, err := buf.WriteString(exposeSVCRemoteCluster); err != nil {
371 t.Fatal(err)
372 }
373 clusters := []Cluster{{
374 Name: "remote",
375 Kubeconfig: "<KUBECONFIG>",
376 IngressClassName: "<INGRESS_CLASS_NAME>",
377 }}
378 if err := json.NewEncoder(&buf).Encode(struct {
379 Clusters []Cluster `json:"clusters"`
380 }{
381 clusters,
382 }); err != nil {
383 t.Fatal(err)
384 }
385 app, err := NewDodoApp(buf.Bytes())
386 if err != nil {
387 for _, e := range errors.Errors(err) {
388 t.Log(e)
389 }
390 t.Fatal(err)
391 }
392 release := Release{
393 Namespace: "foo",
394 AppInstanceId: "foo-bar",
395 RepoAddr: "ssh://192.168.100.210:22/config",
396 AppDir: "/foo/bar",
397 }
398 keyGen := testKeyGen{}
399 r, err := app.Render(release, env, networks, clusters, map[string]any{
400 "managerAddr": "",
401 "appId": "",
402 "sshPrivateKey": "",
403 "port_service_echo_0": 1,
404 "port_service_echo_0_cluster": 2,
405 }, nil, keyGen)
406 if err != nil {
407 t.Fatal(err)
408 }
409 t.Log(string(r.Raw))
410 t.Log(fmt.Sprintf("%+v", r.Ports))
411}