blob: 53962fe354eb31b1e470e6630b8679449b9a291a [file] [log] [blame]
Giorgi Lekveishvili7c427602024-01-04 00:13:55 +04001package installer
2
3import (
gio0eaf2712024-04-14 13:08:46 +04004 _ "embed"
giocb34ad22024-07-11 08:01:13 +04005 "fmt"
gio3cdee592024-04-17 10:15:56 +04006 "net"
Giorgi Lekveishvili7c427602024-01-04 00:13:55 +04007 "testing"
Giorgi Lekveishvili7c427602024-01-04 00:13:55 +04008)
9
giocb34ad22024-07-11 08:01:13 +040010var (
11 env = EnvConfig{
12 InfraName: "dodo",
13 Id: "id",
14 ContactEmail: "foo@bar.ge",
15 Domain: "bar.ge",
16 PrivateDomain: "p.bar.ge",
17 PublicIP: []net.IP{net.ParseIP("1.2.3.4")},
18 NameserverIP: []net.IP{net.ParseIP("1.2.3.4")},
19 NamespacePrefix: "id-",
20 Network: EnvNetwork{
21 DNS: net.ParseIP("1.1.1.1"),
22 DNSInClusterIP: net.ParseIP("2.2.2.2"),
23 Ingress: net.ParseIP("3.3.3.3"),
24 Headscale: net.ParseIP("4.4.4.4"),
25 ServicesFrom: net.ParseIP("5.5.5.5"),
26 ServicesTo: net.ParseIP("6.6.6.6"),
27 },
28 }
29
gio7841f4f2024-07-26 19:53:49 +040030 infraNetworks = []InfraNetwork{
31 {
32 Name: "Public",
33 IngressClass: fmt.Sprintf("%s-ingress-public", env.InfraName),
34 CertificateIssuer: fmt.Sprintf("%s-public", env.Id),
35 AllocatePortAddr: fmt.Sprintf("http://port-allocator.%s-ingress-public.svc.cluster.local/api/allocate", env.InfraName),
36 ReservePortAddr: fmt.Sprintf("http://port-allocator.%s-ingress-public.svc.cluster.local/api/reserve", env.InfraName),
37 DeallocatePortAddr: fmt.Sprintf("http://port-allocator.%s-ingress-public.svc.cluster.local/api/remove", env.InfraName),
38 },
39 }
40
giocb34ad22024-07-11 08:01:13 +040041 networks = []Network{
42 {
43 Name: "Public",
44 IngressClass: fmt.Sprintf("%s-ingress-public", env.InfraName),
45 CertificateIssuer: fmt.Sprintf("%s-public", env.Id),
46 Domain: env.Domain,
47 AllocatePortAddr: fmt.Sprintf("http://port-allocator.%s-ingress-public.svc.cluster.local/api/allocate", env.InfraName),
48 ReservePortAddr: fmt.Sprintf("http://port-allocator.%s-ingress-public.svc.cluster.local/api/reserve", env.InfraName),
49 DeallocatePortAddr: fmt.Sprintf("http://port-allocator.%s-ingress-public.svc.cluster.local/api/remove", env.InfraName),
50 },
51 {
52 Name: "Private",
53 IngressClass: fmt.Sprintf("%s-ingress-private", env.Id),
54 Domain: env.PrivateDomain,
55 AllocatePortAddr: fmt.Sprintf("http://port-allocator.%s-ingress-private.svc.cluster.local/api/allocate", env.Id),
56 ReservePortAddr: fmt.Sprintf("http://port-allocator.%s-ingress-private.svc.cluster.local/api/reserve", env.Id),
57 DeallocatePortAddr: fmt.Sprintf("http://port-allocator.%s-ingress-private.svc.cluster.local/api/remove", env.Id),
58 },
59 }
60)
gioe72b54f2024-04-22 10:44:41 +040061
Giorgi Lekveishvili67383962024-03-22 19:27:34 +040062func TestAuthProxyEnabled(t *testing.T) {
Giorgi Lekveishvili186eae52024-02-15 14:21:41 +040063 r := NewInMemoryAppRepository(CreateAllApps())
gio44f621b2024-04-29 09:44:38 +040064 for _, app := range []string{"rpuppy", "pi-hole", "url-shortener"} {
gio3cdee592024-04-17 10:15:56 +040065 a, err := FindEnvApp(r, app)
Giorgi Lekveishvili67383962024-03-22 19:27:34 +040066 if err != nil {
67 t.Fatal(err)
68 }
69 if a == nil {
70 t.Fatal("returned app is nil")
71 }
gio3cdee592024-04-17 10:15:56 +040072 release := Release{
73 Namespace: "foo",
74 }
gio3cdee592024-04-17 10:15:56 +040075 values := map[string]any{
76 "network": "Public",
77 "subdomain": "woof",
78 "auth": map[string]any{
79 "enabled": true,
80 "groups": "a,b",
Giorgi Lekveishvili67383962024-03-22 19:27:34 +040081 },
82 }
giocb34ad22024-07-11 08:01:13 +040083 rendered, err := a.Render(release, env, networks, values, nil)
Giorgi Lekveishvili67383962024-03-22 19:27:34 +040084 if err != nil {
85 t.Fatal(err)
86 }
87 for _, r := range rendered.Resources {
88 t.Log(string(r))
89 }
90 }
91}
92
93func TestAuthProxyDisabled(t *testing.T) {
94 r := NewInMemoryAppRepository(CreateAllApps())
gio44f621b2024-04-29 09:44:38 +040095 for _, app := range []string{"rpuppy", "pi-hole", "url-shortener"} {
gio3cdee592024-04-17 10:15:56 +040096 a, err := FindEnvApp(r, app)
Giorgi Lekveishvili67383962024-03-22 19:27:34 +040097 if err != nil {
98 t.Fatal(err)
99 }
100 if a == nil {
101 t.Fatal("returned app is nil")
102 }
gio3cdee592024-04-17 10:15:56 +0400103 release := Release{
104 Namespace: "foo",
105 }
gio3cdee592024-04-17 10:15:56 +0400106 values := map[string]any{
107 "network": "Public",
108 "subdomain": "woof",
109 "auth": map[string]any{
110 "enabled": false,
Giorgi Lekveishvili67383962024-03-22 19:27:34 +0400111 },
112 }
giocb34ad22024-07-11 08:01:13 +0400113 rendered, err := a.Render(release, env, networks, values, nil)
Giorgi Lekveishvili67383962024-03-22 19:27:34 +0400114 if err != nil {
115 t.Fatal(err)
116 }
117 for _, r := range rendered.Resources {
118 t.Log(string(r))
119 }
120 }
121}
122
123func TestGroupMemberships(t *testing.T) {
124 r := NewInMemoryAppRepository(CreateAllApps())
gio3cdee592024-04-17 10:15:56 +0400125 a, err := FindEnvApp(r, "memberships")
Giorgi Lekveishvili7c427602024-01-04 00:13:55 +0400126 if err != nil {
Giorgi Lekveishvili186eae52024-02-15 14:21:41 +0400127 t.Fatal(err)
Giorgi Lekveishvili7c427602024-01-04 00:13:55 +0400128 }
Giorgi Lekveishvili186eae52024-02-15 14:21:41 +0400129 if a == nil {
130 t.Fatal("returned app is nil")
Giorgi Lekveishvili7c427602024-01-04 00:13:55 +0400131 }
gio3cdee592024-04-17 10:15:56 +0400132 release := Release{
133 Namespace: "foo",
Giorgi Lekveishvili67383962024-03-22 19:27:34 +0400134 }
gio308105e2024-04-19 13:12:13 +0400135 values := map[string]any{
gio7841f4f2024-07-26 19:53:49 +0400136 "network": "Public",
gio308105e2024-04-19 13:12:13 +0400137 "authGroups": "foo,bar",
138 }
giocb34ad22024-07-11 08:01:13 +0400139 rendered, err := a.Render(release, env, networks, values, nil)
Giorgi Lekveishvili67383962024-03-22 19:27:34 +0400140 if err != nil {
141 t.Fatal(err)
142 }
143 for _, r := range rendered.Resources {
144 t.Log(string(r))
145 }
Giorgi Lekveishvili7c427602024-01-04 00:13:55 +0400146}
Giorgi Lekveishviliee15ee22024-03-28 12:35:10 +0400147
148func TestGerrit(t *testing.T) {
149 r := NewInMemoryAppRepository(CreateAllApps())
gio3cdee592024-04-17 10:15:56 +0400150 a, err := FindEnvApp(r, "gerrit")
Giorgi Lekveishviliee15ee22024-03-28 12:35:10 +0400151 if err != nil {
152 t.Fatal(err)
153 }
154 if a == nil {
155 t.Fatal("returned app is nil")
156 }
gio3cdee592024-04-17 10:15:56 +0400157 release := Release{
158 Namespace: "foo",
Giorgi Lekveishvili35982662024-04-05 13:05:40 +0400159 }
gio3cdee592024-04-17 10:15:56 +0400160 values := map[string]any{
161 "subdomain": "gerrit",
162 "network": "Private",
163 "key": map[string]any{
164 "public": "foo",
165 "private": "bar",
166 },
167 "sshPort": 22,
168 }
giocb34ad22024-07-11 08:01:13 +0400169 rendered, err := a.Render(release, env, networks, values, nil)
Giorgi Lekveishvili35982662024-04-05 13:05:40 +0400170 if err != nil {
171 t.Fatal(err)
172 }
173 for _, r := range rendered.Resources {
174 t.Log(string(r))
175 }
176}
177
178func TestJenkins(t *testing.T) {
179 r := NewInMemoryAppRepository(CreateAllApps())
gio3cdee592024-04-17 10:15:56 +0400180 a, err := FindEnvApp(r, "jenkins")
Giorgi Lekveishvili35982662024-04-05 13:05:40 +0400181 if err != nil {
182 t.Fatal(err)
183 }
184 if a == nil {
185 t.Fatal("returned app is nil")
186 }
gio3cdee592024-04-17 10:15:56 +0400187 release := Release{
188 Namespace: "foo",
Giorgi Lekveishviliee15ee22024-03-28 12:35:10 +0400189 }
gio3cdee592024-04-17 10:15:56 +0400190 values := map[string]any{
191 "subdomain": "jenkins",
192 "network": "Private",
193 }
giocb34ad22024-07-11 08:01:13 +0400194 rendered, err := a.Render(release, env, networks, values, nil)
Giorgi Lekveishviliee15ee22024-03-28 12:35:10 +0400195 if err != nil {
196 t.Fatal(err)
197 }
198 for _, r := range rendered.Resources {
199 t.Log(string(r))
200 }
201}
giodb274d12024-04-19 11:53:18 +0400202
203func TestIngressPublic(t *testing.T) {
204 r := NewInMemoryAppRepository(CreateAllApps())
205 a, err := FindInfraApp(r, "ingress-public")
206 if err != nil {
207 t.Fatal(err)
208 }
209 if a == nil {
210 t.Fatal("returned app is nil")
211 }
212 release := Release{
213 Namespace: "foo",
214 }
gioe72b54f2024-04-22 10:44:41 +0400215 infra := InfraConfig{
giodb274d12024-04-19 11:53:18 +0400216 Name: "dodo",
217 PublicIP: []net.IP{net.ParseIP("1.2.3.4")},
218 InfraNamespacePrefix: "id-",
219 InfraAdminPublicKey: []byte("foo"),
220 }
221 values := map[string]any{
222 "sshPrivateKey": "private",
223 }
gio7841f4f2024-07-26 19:53:49 +0400224 rendered, err := a.Render(release, infra, infraNetworks, values, nil)
giodb274d12024-04-19 11:53:18 +0400225 if err != nil {
226 t.Fatal(err)
227 }
228 for _, r := range rendered.Resources {
229 t.Log(string(r))
230 }
231}
232
233func TestPrivateNetwork(t *testing.T) {
234 r := NewInMemoryAppRepository(CreateAllApps())
235 a, err := FindEnvApp(r, "private-network")
236 if err != nil {
237 t.Fatal(err)
238 }
239 if a == nil {
240 t.Fatal("returned app is nil")
241 }
242 release := Release{
243 Namespace: "foo",
244 }
giodb274d12024-04-19 11:53:18 +0400245 values := map[string]any{
246 "privateNetwork": map[string]any{
247 "hostname": "foo",
248 "username": "bar",
249 "ipSubnet": "123123",
250 },
251 "sshPrivateKey": "private",
252 }
giocb34ad22024-07-11 08:01:13 +0400253 rendered, err := a.Render(release, env, networks, values, nil)
giodb274d12024-04-19 11:53:18 +0400254 if err != nil {
255 t.Fatal(err)
256 }
257 for _, r := range rendered.Resources {
258 t.Log(string(r))
259 }
260}
gio308105e2024-04-19 13:12:13 +0400261
262func TestAppPackages(t *testing.T) {
263 contents, err := valuesTmpls.ReadFile("values-tmpl/rpuppy.cue")
264 if err != nil {
265 t.Fatal(err)
266 }
267 app, err := NewCueEnvApp(CueAppData{
gioe72b54f2024-04-22 10:44:41 +0400268 "base.cue": []byte(cueBaseConfig),
269 "app.cue": []byte(contents),
270 "global.cue": []byte(cueEnvAppGlobal),
gio308105e2024-04-19 13:12:13 +0400271 })
272 if err != nil {
273 t.Fatal(err)
274 }
275 release := Release{
276 Namespace: "foo",
277 }
gio308105e2024-04-19 13:12:13 +0400278 values := map[string]any{
279 "network": "Public",
280 "subdomain": "woof",
281 "auth": map[string]any{
282 "enabled": true,
283 "groups": "a,b",
284 },
285 }
giocb34ad22024-07-11 08:01:13 +0400286 rendered, err := app.Render(release, env, networks, values, nil)
gio308105e2024-04-19 13:12:13 +0400287 if err != nil {
288 t.Fatal(err)
289 }
290 for _, r := range rendered.Resources {
291 t.Log(string(r))
292 }
293 for _, r := range rendered.Data {
294 t.Log(string(r))
295 }
296}
gioe72b54f2024-04-22 10:44:41 +0400297
298func TestDNSGateway(t *testing.T) {
299 contents, err := valuesTmpls.ReadFile("values-tmpl/dns-gateway.cue")
300 if err != nil {
301 t.Fatal(err)
302 }
303 app, err := NewCueInfraApp(CueAppData{
304 "base.cue": []byte(cueBaseConfig),
305 "app.cue": []byte(contents),
306 "global.cue": []byte(cueInfraAppGlobal),
307 })
308 if err != nil {
309 t.Fatal(err)
310 }
311 release := Release{
312 Namespace: "foo",
313 AppInstanceId: "dns-gateway",
314 RepoAddr: "ssh://192.168.100.210:22/config",
315 AppDir: "/infrastructure/gns-gateway",
316 }
317 infra := InfraConfig{
318 Name: "dodo",
319 PublicIP: []net.IP{net.ParseIP("135.181.48.180"), net.ParseIP("65.108.39.172")},
320 InfraNamespacePrefix: "dodo-",
321 InfraAdminPublicKey: []byte("ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC/ZRj0QJ0j+3udh0ANN9mJyEzrATZIOAHfNikDMpSHqrVbPZqpeHGbdYrSksCvXPXfissIZoYU4CCXX007jY0W6e1mPf1nObYh2eUT1dHo/8UtGaf9nYk+kEGU/k3utN4Uzkxa13IFh9pYERX+o0Ad3X5wh0vi5hjOBAJVKOCD9d3aipeR9piUb+qrkFDXf9fozMFn7D9nALkpJBVuGxwl/76f8K6hRxBEmPqZwIMfklzX15nRdLEcsGFJpYLYXsonbr1P3moMJFBBbQFv6M6JO9rrwA+swXpWMoScI7m/nziSEPLAb+ziv+/OyhqzeC9CQner73V0m8+2DmtcgTuSe1qHRtOScPyIjBfxoXaUx1IUkgq1NXt8k+EBO2mxnVpKdyDCvwT1Tb7088P8f8cSLtUOmUdEiAhB8bfQFprzm2KrlufenfhMvdvQPU4VfWlkQ4smLYt2yVaaXoxZMy5yD3X6LFurNXwee/Gn6di+DWqsASAOsmpsNgSCGhT8wxM= lekva@gl-mbp-m1-max.local"),
322 }
323 values := map[string]any{
324 "servers": []EnvDNS{EnvDNS{"v1.dodo.cloud", "10.0.1.2"}},
325 }
gio7841f4f2024-07-26 19:53:49 +0400326 rendered, err := app.Render(release, infra, infraNetworks, values, nil)
gioe72b54f2024-04-22 10:44:41 +0400327 if err != nil {
328 t.Fatal(err)
329 }
330 for _, r := range rendered.Resources {
331 t.Log(string(r))
332 }
333 for _, r := range rendered.Data {
334 t.Log(string(r))
335 }
336}
gio0eaf2712024-04-14 13:08:46 +0400337
giof8843412024-05-22 16:38:05 +0400338//go:embed app_configs/testapp.cue
gio0eaf2712024-04-14 13:08:46 +0400339var testAppCue []byte
340
gio0eaf2712024-04-14 13:08:46 +0400341func TestPCloudApp(t *testing.T) {
gio1364e432024-06-29 11:39:18 +0400342 app, err := NewDodoApp(testAppCue)
343 if err != nil {
344 t.Fatal(err)
345 }
346 release := Release{
347 Namespace: "foo",
348 AppInstanceId: "foo-bar",
349 RepoAddr: "ssh://192.168.100.210:22/config",
350 AppDir: "/foo/bar",
351 }
giocb34ad22024-07-11 08:01:13 +0400352 _, err = app.Render(release, env, networks, map[string]any{
gioa60f0de2024-07-08 10:49:48 +0400353 "repoAddr": "",
354 "managerAddr": "",
355 "appId": "",
356 "sshPrivateKey": "",
gio1364e432024-06-29 11:39:18 +0400357 }, nil)
gio0eaf2712024-04-14 13:08:46 +0400358 if err != nil {
359 t.Fatal(err)
360 }
361}
gio266c04f2024-07-03 14:18:45 +0400362
363func TestDodoAppInstance(t *testing.T) {
364 r := NewInMemoryAppRepository(CreateAllApps())
365 a, err := FindEnvApp(r, "dodo-app-instance")
366 if err != nil {
367 t.Fatal(err)
368 }
369 if a == nil {
370 t.Fatal("returned app is nil")
371 }
372 release := Release{
373 Namespace: "foo",
374 }
375 values := map[string]any{
gio266c04f2024-07-03 14:18:45 +0400376 "repoAddr": "",
gio33059762024-07-05 13:19:07 +0400377 "repoHost": "",
gio266c04f2024-07-03 14:18:45 +0400378 "gitRepoPublicKey": "",
379 }
giocb34ad22024-07-11 08:01:13 +0400380 rendered, err := a.Render(release, env, networks, values, nil)
gio266c04f2024-07-03 14:18:45 +0400381 if err != nil {
382 t.Fatal(err)
383 }
384 for _, r := range rendered.Resources {
385 t.Log(string(r))
386 }
387}
gio4ece99c2024-07-18 11:05:50 +0400388
389func TestDodoApp(t *testing.T) {
390 contents, err := valuesTmpls.ReadFile("values-tmpl/dodo-app.cue")
391 if err != nil {
392 t.Fatal(err)
393 }
394 app, err := NewCueEnvApp(CueAppData{
395 "base.cue": []byte(cueBaseConfig),
396 "app.cue": []byte(contents),
397 "global.cue": []byte(cueEnvAppGlobal),
398 })
399 if err != nil {
400 t.Fatal(err)
401 }
402 t.Log(app.Schema())
403}