blob: 1367c65a6e306bce50d07b8131cf14593a533b6e [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"
17 ingress: {
18 network: "private"
19 subdomain: "testapp"
20 auth: enabled: false
21 }
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 ],
165 "ingress": {
166 "network": "Private",
167 "subdomain": "foo",
168 "port": {
169 "name": "web"
170 },
171 "auth": {
172 "enabled": false
173 }
174 },
175 "expose": [],
176 "dev": { "enabled": true, "username": "gio" }
177 }
178 ],
179 "volume": [],
180 "postgresql": [
181 {
182 "name": "db",
183 "size": "1Gi",
184 "expose": []
185 }
186 ],
187 "mongodb": []
188}
189`
190
191func TestCanvas(t *testing.T) {
192 app, err := NewDodoApp([]byte(canvas))
193 if err != nil {
gio561724f2024-11-04 08:37:34 +0400194 for _, e := range errors.Errors(err) {
giofc441e32024-11-11 16:26:14 +0400195 t.Log(e)
gio561724f2024-11-04 08:37:34 +0400196 }
197 t.Fatal(err)
198 }
giofc441e32024-11-11 16:26:14 +0400199 release := Release{
200 Namespace: "foo",
201 AppInstanceId: "foo-bar",
202 RepoAddr: "ssh://192.168.100.210:22/config",
203 AppDir: "/foo/bar",
204 }
205 keyGen := testKeyGen{}
206 r, err := app.Render(release, env, networks, nil, map[string]any{
207 "managerAddr": "",
208 "appId": "",
209 "sshPrivateKey": "",
210 }, nil, keyGen)
211 if err != nil {
212 t.Fatal(err)
213 }
gio561724f2024-11-04 08:37:34 +0400214 t.Log(string(r.Raw))
215}
gio721c0042025-04-03 11:56:36 +0400216
giof4344632025-04-08 20:04:35 +0400217const exposeRemoteClusterPrivateNetwork = `
gio721c0042025-04-03 11:56:36 +0400218{
219 "cluster": "remote",
220 "postgresql": [{
221 "name": "db",
222 "size": "1Gi",
223 "expose": [{
224 "network": "Private",
225 "subdomain": "pg"
226 }]
227 }],
228}
229`
230
giof4344632025-04-08 20:04:35 +0400231func TestExposeRemoteClusterPrivateNetwork(t *testing.T) {
gio721c0042025-04-03 11:56:36 +0400232 var buf bytes.Buffer
giof4344632025-04-08 20:04:35 +0400233 if _, err := buf.WriteString(exposeRemoteClusterPrivateNetwork); err != nil {
gio721c0042025-04-03 11:56:36 +0400234 t.Fatal(err)
235 }
236 clusters := []Cluster{{
237 Name: "remote",
238 Kubeconfig: "<KUBECONFIG>",
239 IngressClassName: "<INGRESS_CLASS_NAME>",
240 }}
241 if err := json.NewEncoder(&buf).Encode(struct {
242 Clusters []Cluster `json:"clusters"`
243 }{
244 clusters,
245 }); err != nil {
246 t.Fatal(err)
247 }
248 app, err := NewDodoApp(buf.Bytes())
249 if err != nil {
250 for _, e := range errors.Errors(err) {
251 t.Log(e)
252 }
253 t.Fatal(err)
254 }
255 release := Release{
256 Namespace: "foo",
257 AppInstanceId: "foo-bar",
258 RepoAddr: "ssh://192.168.100.210:22/config",
259 AppDir: "/foo/bar",
260 }
261 keyGen := testKeyGen{}
262 r, err := app.Render(release, env, networks, clusters, map[string]any{
263 "managerAddr": "",
264 "appId": "",
265 "sshPrivateKey": "",
266 "port_postgresql_db_0": 1,
267 "port_postgresql_db_0_cluster": 2,
268 }, nil, keyGen)
269 if err != nil {
270 t.Fatal(err)
271 }
272 t.Log(string(r.Raw))
giod78896a2025-04-10 07:42:13 +0400273 t.Log(fmt.Sprintf("%+v", r.Ports))
gio721c0042025-04-03 11:56:36 +0400274}
giof4344632025-04-08 20:04:35 +0400275
276const exposeRemoteClusterPublicNetwork = `
277{
278 "cluster": "remote",
279 "postgresql": [{
280 "name": "db",
281 "size": "1Gi",
282 "expose": [{
283 "network": "Public",
284 "subdomain": "pg"
285 }]
286 }],
287}
288`
289
290func TestExposeRemoteClusterPublicNetwork(t *testing.T) {
291 var buf bytes.Buffer
292 if _, err := buf.WriteString(exposeRemoteClusterPublicNetwork); err != nil {
293 t.Fatal(err)
294 }
295 clusters := []Cluster{{
296 Name: "remote",
297 Kubeconfig: "<KUBECONFIG>",
298 IngressClassName: "<INGRESS_CLASS_NAME>",
299 }}
300 if err := json.NewEncoder(&buf).Encode(struct {
301 Clusters []Cluster `json:"clusters"`
302 }{
303 clusters,
304 }); err != nil {
305 t.Fatal(err)
306 }
307 app, err := NewDodoApp(buf.Bytes())
308 if err != nil {
309 for _, e := range errors.Errors(err) {
310 t.Log(e)
311 }
312 t.Fatal(err)
313 }
314 release := Release{
315 Namespace: "foo",
316 AppInstanceId: "foo-bar",
317 RepoAddr: "ssh://192.168.100.210:22/config",
318 AppDir: "/foo/bar",
319 }
320 keyGen := testKeyGen{}
321 r, err := app.Render(release, env, networks, clusters, map[string]any{
322 "managerAddr": "",
323 "appId": "",
324 "sshPrivateKey": "",
325 "port_postgresql_db_0": 1,
326 "port_postgresql_db_0_cluster": 2,
327 "port_postgresql_db_0_private": 3,
328 }, nil, keyGen)
329 if err != nil {
330 t.Fatal(err)
331 }
332 t.Log(string(r.Raw))
333}
giof55ab362025-04-11 17:48:17 +0400334
335const exposeSVCRemoteCluster = `
336{
337 "cluster": "remote",
338 "service": [{
339 "name": "echo",
340 "type": "golang:1.20.0",
341 "source": {
342 "repository": "ssh://foo.bar"
343 },
344 "ports": [{
345 "name": "echo",
346 "value": 9090
347 }],
348 "expose": [{
349 "port": {
350 "name": "echo"
351 },
352 "network": "Private",
353 "subdomain": "echo"
354 }]
355 }]
356}
357`
358
359func TestExposeSVCRemoteCluster(t *testing.T) {
360 var buf bytes.Buffer
361 if _, err := buf.WriteString(exposeSVCRemoteCluster); err != nil {
362 t.Fatal(err)
363 }
364 clusters := []Cluster{{
365 Name: "remote",
366 Kubeconfig: "<KUBECONFIG>",
367 IngressClassName: "<INGRESS_CLASS_NAME>",
368 }}
369 if err := json.NewEncoder(&buf).Encode(struct {
370 Clusters []Cluster `json:"clusters"`
371 }{
372 clusters,
373 }); err != nil {
374 t.Fatal(err)
375 }
376 app, err := NewDodoApp(buf.Bytes())
377 if err != nil {
378 for _, e := range errors.Errors(err) {
379 t.Log(e)
380 }
381 t.Fatal(err)
382 }
383 release := Release{
384 Namespace: "foo",
385 AppInstanceId: "foo-bar",
386 RepoAddr: "ssh://192.168.100.210:22/config",
387 AppDir: "/foo/bar",
388 }
389 keyGen := testKeyGen{}
390 r, err := app.Render(release, env, networks, clusters, map[string]any{
391 "managerAddr": "",
392 "appId": "",
393 "sshPrivateKey": "",
394 "port_service_echo_0": 1,
395 "port_service_echo_0_cluster": 2,
396 }, nil, keyGen)
397 if err != nil {
398 t.Fatal(err)
399 }
400 t.Log(string(r.Raw))
401 t.Log(fmt.Sprintf("%+v", r.Ports))
402}