blob: 6c4df1f0c81d470beb1a46834bdaac516543948f [file] [log] [blame]
gio561724f2024-11-04 08:37:34 +04001package installer
2
3import (
gio721c0042025-04-03 11:56:36 +04004 "bytes"
5 "encoding/json"
gio561724f2024-11-04 08:37:34 +04006 "testing"
7
8 "cuelang.org/go/cue/errors"
9)
10
giofc441e32024-11-11 16:26:14 +040011var exposed = `
12service: [{
13 name: "app"
gio561724f2024-11-04 08:37:34 +040014 type: "golang:1.20.0"
15 run: "main.go"
16 ingress: {
17 network: "private"
18 subdomain: "testapp"
19 auth: enabled: false
20 }
giofc441e32024-11-11 16:26:14 +040021 source: repository: "ssh://foo.bar"
22 ports: [{
23 name: "a"
24 value: 100
25 }, {
26 name: "web"
27 value: 8080
28 }, {
29 name: "b"
30 value: 101
31 }]
32 expose: [{
33 network: "private"
34 subdomain: "1"
35 port: value: 100
36 }, {
37 network: "public"
38 subdomain:"2"
39 port: name: "web"
40 }, {
41 network: "private"
42 subdomain: "3"
43 port: value: 101
44 }]
45}]
gio561724f2024-11-04 08:37:34 +040046
47postgresql: [{
48 name: "db_1"
giofc441e32024-11-11 16:26:14 +040049 expose: [{
50 network: "private"
51 subdomain: "1"
52 }, {
53 network: "public"
54 subdomain:"2"
55 }, {
56 network: "private"
57 subdomain: "3"
58 }]
gio561724f2024-11-04 08:37:34 +040059}, {
60 name: "db_2"
giofc441e32024-11-11 16:26:14 +040061 expose: [{
62 network: "public"
63 subdomain: "1"
64 }, {
65 network: "private"
66 subdomain:"2"
67 }, {
68 network: "public"
69 subdomain: "3"
70 }]
71}]
gio561724f2024-11-04 08:37:34 +040072
giofc441e32024-11-11 16:26:14 +040073mongodb: [{
74 name: "mdb_1"
75 expose: [{
76 network: "public"
77 subdomain: "1"
78 }, {
79 network: "private"
80 subdomain:"2"
81 }, {
82 network: "public"
83 subdomain: "3"
84 }]
85}, {
86 name: "mdb_2"
87 expose: [{
88 network: "private"
89 subdomain: "1"
90 }, {
91 network: "public"
92 subdomain:"2"
93 }, {
94 network: "private"
95 subdomain: "3"
96 }]
97}]
98`
99
100func TestExposedPorts(t *testing.T) {
101 app, err := NewDodoApp([]byte(exposed))
gio561724f2024-11-04 08:37:34 +0400102 if err != nil {
103 for _, e := range errors.Errors(err) {
104 t.Log(e)
105 }
106 t.Fatal(err)
107 }
gio561724f2024-11-04 08:37:34 +0400108 release := Release{
109 Namespace: "foo",
110 AppInstanceId: "foo-bar",
111 RepoAddr: "ssh://192.168.100.210:22/config",
112 AppDir: "/foo/bar",
113 }
114 keyGen := testKeyGen{}
115 r, err := app.Render(release, env, networks, nil, map[string]any{
giofc441e32024-11-11 16:26:14 +0400116 "managerAddr": "",
117 "appId": "",
118 "sshPrivateKey": "",
119 "port_postgresql_db_1_0": 1,
120 "port_postgresql_db_1_1": 2,
121 "port_postgresql_db_1_2": 3,
122 "port_postgresql_db_2_0": 4,
123 "port_postgresql_db_2_1": 5,
124 "port_postgresql_db_2_2": 6,
125 "port_mongodb_mdb_1_0": 1,
126 "port_mongodb_mdb_1_1": 2,
127 "port_mongodb_mdb_1_2": 3,
128 "port_mongodb_mdb_2_0": 4,
129 "port_mongodb_mdb_2_1": 5,
130 "port_mongodb_mdb_2_2": 6,
131 "port_service_app_0": 7,
132 "port_service_app_1": 8,
133 "port_service_app_2": 9,
gio561724f2024-11-04 08:37:34 +0400134 }, nil, keyGen)
135 if err != nil {
giofc441e32024-11-11 16:26:14 +0400136 t.Fatal(err)
137 }
138 t.Log(string(r.Raw))
139}
140
141const canvas = `
142{
143 "service": [
144 {
145 "type": "nextjs:deno-2.0.0",
146 "name": "app",
147 "source": {
148 "repository": "ssh://d.p.v1.dodo.cloud:62533/myblog",
149 "branch": "master",
150 "rootDir": "/"
151 },
152 "ports": [
153 {
154 "name": "web",
155 "value": 3000,
156 "protocol": "TCP"
157 }
158 ],
159 "env": [
160 {
161 "name": "DODO_POSTGRESQL_DB_CONNECTION_URL"
162 }
163 ],
164 "ingress": {
165 "network": "Private",
166 "subdomain": "foo",
167 "port": {
168 "name": "web"
169 },
170 "auth": {
171 "enabled": false
172 }
173 },
174 "expose": [],
175 "dev": { "enabled": true, "username": "gio" }
176 }
177 ],
178 "volume": [],
179 "postgresql": [
180 {
181 "name": "db",
182 "size": "1Gi",
183 "expose": []
184 }
185 ],
186 "mongodb": []
187}
188`
189
190func TestCanvas(t *testing.T) {
191 app, err := NewDodoApp([]byte(canvas))
192 if err != nil {
gio561724f2024-11-04 08:37:34 +0400193 for _, e := range errors.Errors(err) {
giofc441e32024-11-11 16:26:14 +0400194 t.Log(e)
gio561724f2024-11-04 08:37:34 +0400195 }
196 t.Fatal(err)
197 }
giofc441e32024-11-11 16:26:14 +0400198 release := Release{
199 Namespace: "foo",
200 AppInstanceId: "foo-bar",
201 RepoAddr: "ssh://192.168.100.210:22/config",
202 AppDir: "/foo/bar",
203 }
204 keyGen := testKeyGen{}
205 r, err := app.Render(release, env, networks, nil, map[string]any{
206 "managerAddr": "",
207 "appId": "",
208 "sshPrivateKey": "",
209 }, nil, keyGen)
210 if err != nil {
211 t.Fatal(err)
212 }
gio561724f2024-11-04 08:37:34 +0400213 t.Log(string(r.Raw))
214}
gio721c0042025-04-03 11:56:36 +0400215
giof4344632025-04-08 20:04:35 +0400216const exposeRemoteClusterPrivateNetwork = `
gio721c0042025-04-03 11:56:36 +0400217{
218 "cluster": "remote",
219 "postgresql": [{
220 "name": "db",
221 "size": "1Gi",
222 "expose": [{
223 "network": "Private",
224 "subdomain": "pg"
225 }]
226 }],
227}
228`
229
giof4344632025-04-08 20:04:35 +0400230func TestExposeRemoteClusterPrivateNetwork(t *testing.T) {
gio721c0042025-04-03 11:56:36 +0400231 var buf bytes.Buffer
giof4344632025-04-08 20:04:35 +0400232 if _, err := buf.WriteString(exposeRemoteClusterPrivateNetwork); err != nil {
gio721c0042025-04-03 11:56:36 +0400233 t.Fatal(err)
234 }
235 clusters := []Cluster{{
236 Name: "remote",
237 Kubeconfig: "<KUBECONFIG>",
238 IngressClassName: "<INGRESS_CLASS_NAME>",
239 }}
240 if err := json.NewEncoder(&buf).Encode(struct {
241 Clusters []Cluster `json:"clusters"`
242 }{
243 clusters,
244 }); err != nil {
245 t.Fatal(err)
246 }
247 app, err := NewDodoApp(buf.Bytes())
248 if err != nil {
249 for _, e := range errors.Errors(err) {
250 t.Log(e)
251 }
252 t.Fatal(err)
253 }
254 release := Release{
255 Namespace: "foo",
256 AppInstanceId: "foo-bar",
257 RepoAddr: "ssh://192.168.100.210:22/config",
258 AppDir: "/foo/bar",
259 }
260 keyGen := testKeyGen{}
261 r, err := app.Render(release, env, networks, clusters, map[string]any{
262 "managerAddr": "",
263 "appId": "",
264 "sshPrivateKey": "",
265 "port_postgresql_db_0": 1,
266 "port_postgresql_db_0_cluster": 2,
267 }, nil, keyGen)
268 if err != nil {
269 t.Fatal(err)
270 }
271 t.Log(string(r.Raw))
272}
giof4344632025-04-08 20:04:35 +0400273
274const exposeRemoteClusterPublicNetwork = `
275{
276 "cluster": "remote",
277 "postgresql": [{
278 "name": "db",
279 "size": "1Gi",
280 "expose": [{
281 "network": "Public",
282 "subdomain": "pg"
283 }]
284 }],
285}
286`
287
288func TestExposeRemoteClusterPublicNetwork(t *testing.T) {
289 var buf bytes.Buffer
290 if _, err := buf.WriteString(exposeRemoteClusterPublicNetwork); err != nil {
291 t.Fatal(err)
292 }
293 clusters := []Cluster{{
294 Name: "remote",
295 Kubeconfig: "<KUBECONFIG>",
296 IngressClassName: "<INGRESS_CLASS_NAME>",
297 }}
298 if err := json.NewEncoder(&buf).Encode(struct {
299 Clusters []Cluster `json:"clusters"`
300 }{
301 clusters,
302 }); err != nil {
303 t.Fatal(err)
304 }
305 app, err := NewDodoApp(buf.Bytes())
306 if err != nil {
307 for _, e := range errors.Errors(err) {
308 t.Log(e)
309 }
310 t.Fatal(err)
311 }
312 release := Release{
313 Namespace: "foo",
314 AppInstanceId: "foo-bar",
315 RepoAddr: "ssh://192.168.100.210:22/config",
316 AppDir: "/foo/bar",
317 }
318 keyGen := testKeyGen{}
319 r, err := app.Render(release, env, networks, clusters, map[string]any{
320 "managerAddr": "",
321 "appId": "",
322 "sshPrivateKey": "",
323 "port_postgresql_db_0": 1,
324 "port_postgresql_db_0_cluster": 2,
325 "port_postgresql_db_0_private": 3,
326 }, nil, keyGen)
327 if err != nil {
328 t.Fatal(err)
329 }
330 t.Log(string(r.Raw))
331}