blob: 7e64d5037353c47536b68cd9ef43ddd339e0d02f [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
30 networks = []Network{
31 {
32 Name: "Public",
33 IngressClass: fmt.Sprintf("%s-ingress-public", env.InfraName),
34 CertificateIssuer: fmt.Sprintf("%s-public", env.Id),
35 Domain: env.Domain,
36 AllocatePortAddr: fmt.Sprintf("http://port-allocator.%s-ingress-public.svc.cluster.local/api/allocate", env.InfraName),
37 ReservePortAddr: fmt.Sprintf("http://port-allocator.%s-ingress-public.svc.cluster.local/api/reserve", env.InfraName),
38 DeallocatePortAddr: fmt.Sprintf("http://port-allocator.%s-ingress-public.svc.cluster.local/api/remove", env.InfraName),
39 },
40 {
41 Name: "Private",
42 IngressClass: fmt.Sprintf("%s-ingress-private", env.Id),
43 Domain: env.PrivateDomain,
44 AllocatePortAddr: fmt.Sprintf("http://port-allocator.%s-ingress-private.svc.cluster.local/api/allocate", env.Id),
45 ReservePortAddr: fmt.Sprintf("http://port-allocator.%s-ingress-private.svc.cluster.local/api/reserve", env.Id),
46 DeallocatePortAddr: fmt.Sprintf("http://port-allocator.%s-ingress-private.svc.cluster.local/api/remove", env.Id),
47 },
48 }
49)
gioe72b54f2024-04-22 10:44:41 +040050
Giorgi Lekveishvili67383962024-03-22 19:27:34 +040051func TestAuthProxyEnabled(t *testing.T) {
Giorgi Lekveishvili186eae52024-02-15 14:21:41 +040052 r := NewInMemoryAppRepository(CreateAllApps())
gio44f621b2024-04-29 09:44:38 +040053 for _, app := range []string{"rpuppy", "pi-hole", "url-shortener"} {
gio3cdee592024-04-17 10:15:56 +040054 a, err := FindEnvApp(r, app)
Giorgi Lekveishvili67383962024-03-22 19:27:34 +040055 if err != nil {
56 t.Fatal(err)
57 }
58 if a == nil {
59 t.Fatal("returned app is nil")
60 }
gio3cdee592024-04-17 10:15:56 +040061 release := Release{
62 Namespace: "foo",
63 }
gio3cdee592024-04-17 10:15:56 +040064 values := map[string]any{
65 "network": "Public",
66 "subdomain": "woof",
67 "auth": map[string]any{
68 "enabled": true,
69 "groups": "a,b",
Giorgi Lekveishvili67383962024-03-22 19:27:34 +040070 },
71 }
giocb34ad22024-07-11 08:01:13 +040072 rendered, err := a.Render(release, env, networks, values, nil)
Giorgi Lekveishvili67383962024-03-22 19:27:34 +040073 if err != nil {
74 t.Fatal(err)
75 }
76 for _, r := range rendered.Resources {
77 t.Log(string(r))
78 }
79 }
80}
81
82func TestAuthProxyDisabled(t *testing.T) {
83 r := NewInMemoryAppRepository(CreateAllApps())
gio44f621b2024-04-29 09:44:38 +040084 for _, app := range []string{"rpuppy", "pi-hole", "url-shortener"} {
gio3cdee592024-04-17 10:15:56 +040085 a, err := FindEnvApp(r, app)
Giorgi Lekveishvili67383962024-03-22 19:27:34 +040086 if err != nil {
87 t.Fatal(err)
88 }
89 if a == nil {
90 t.Fatal("returned app is nil")
91 }
gio3cdee592024-04-17 10:15:56 +040092 release := Release{
93 Namespace: "foo",
94 }
gio3cdee592024-04-17 10:15:56 +040095 values := map[string]any{
96 "network": "Public",
97 "subdomain": "woof",
98 "auth": map[string]any{
99 "enabled": false,
Giorgi Lekveishvili67383962024-03-22 19:27:34 +0400100 },
101 }
giocb34ad22024-07-11 08:01:13 +0400102 rendered, err := a.Render(release, env, networks, values, nil)
Giorgi Lekveishvili67383962024-03-22 19:27:34 +0400103 if err != nil {
104 t.Fatal(err)
105 }
106 for _, r := range rendered.Resources {
107 t.Log(string(r))
108 }
109 }
110}
111
112func TestGroupMemberships(t *testing.T) {
113 r := NewInMemoryAppRepository(CreateAllApps())
gio3cdee592024-04-17 10:15:56 +0400114 a, err := FindEnvApp(r, "memberships")
Giorgi Lekveishvili7c427602024-01-04 00:13:55 +0400115 if err != nil {
Giorgi Lekveishvili186eae52024-02-15 14:21:41 +0400116 t.Fatal(err)
Giorgi Lekveishvili7c427602024-01-04 00:13:55 +0400117 }
Giorgi Lekveishvili186eae52024-02-15 14:21:41 +0400118 if a == nil {
119 t.Fatal("returned app is nil")
Giorgi Lekveishvili7c427602024-01-04 00:13:55 +0400120 }
gio3cdee592024-04-17 10:15:56 +0400121 release := Release{
122 Namespace: "foo",
Giorgi Lekveishvili67383962024-03-22 19:27:34 +0400123 }
gio308105e2024-04-19 13:12:13 +0400124 values := map[string]any{
125 "authGroups": "foo,bar",
126 }
giocb34ad22024-07-11 08:01:13 +0400127 rendered, err := a.Render(release, env, networks, values, nil)
Giorgi Lekveishvili67383962024-03-22 19:27:34 +0400128 if err != nil {
129 t.Fatal(err)
130 }
131 for _, r := range rendered.Resources {
132 t.Log(string(r))
133 }
Giorgi Lekveishvili7c427602024-01-04 00:13:55 +0400134}
Giorgi Lekveishviliee15ee22024-03-28 12:35:10 +0400135
136func TestGerrit(t *testing.T) {
137 r := NewInMemoryAppRepository(CreateAllApps())
gio3cdee592024-04-17 10:15:56 +0400138 a, err := FindEnvApp(r, "gerrit")
Giorgi Lekveishviliee15ee22024-03-28 12:35:10 +0400139 if err != nil {
140 t.Fatal(err)
141 }
142 if a == nil {
143 t.Fatal("returned app is nil")
144 }
gio3cdee592024-04-17 10:15:56 +0400145 release := Release{
146 Namespace: "foo",
Giorgi Lekveishvili35982662024-04-05 13:05:40 +0400147 }
gio3cdee592024-04-17 10:15:56 +0400148 values := map[string]any{
149 "subdomain": "gerrit",
150 "network": "Private",
151 "key": map[string]any{
152 "public": "foo",
153 "private": "bar",
154 },
155 "sshPort": 22,
156 }
giocb34ad22024-07-11 08:01:13 +0400157 rendered, err := a.Render(release, env, networks, values, nil)
Giorgi Lekveishvili35982662024-04-05 13:05:40 +0400158 if err != nil {
159 t.Fatal(err)
160 }
161 for _, r := range rendered.Resources {
162 t.Log(string(r))
163 }
164}
165
166func TestJenkins(t *testing.T) {
167 r := NewInMemoryAppRepository(CreateAllApps())
gio3cdee592024-04-17 10:15:56 +0400168 a, err := FindEnvApp(r, "jenkins")
Giorgi Lekveishvili35982662024-04-05 13:05:40 +0400169 if err != nil {
170 t.Fatal(err)
171 }
172 if a == nil {
173 t.Fatal("returned app is nil")
174 }
gio3cdee592024-04-17 10:15:56 +0400175 release := Release{
176 Namespace: "foo",
Giorgi Lekveishviliee15ee22024-03-28 12:35:10 +0400177 }
gio3cdee592024-04-17 10:15:56 +0400178 values := map[string]any{
179 "subdomain": "jenkins",
180 "network": "Private",
181 }
giocb34ad22024-07-11 08:01:13 +0400182 rendered, err := a.Render(release, env, networks, values, nil)
Giorgi Lekveishviliee15ee22024-03-28 12:35:10 +0400183 if err != nil {
184 t.Fatal(err)
185 }
186 for _, r := range rendered.Resources {
187 t.Log(string(r))
188 }
189}
giodb274d12024-04-19 11:53:18 +0400190
191func TestIngressPublic(t *testing.T) {
192 r := NewInMemoryAppRepository(CreateAllApps())
193 a, err := FindInfraApp(r, "ingress-public")
194 if err != nil {
195 t.Fatal(err)
196 }
197 if a == nil {
198 t.Fatal("returned app is nil")
199 }
200 release := Release{
201 Namespace: "foo",
202 }
gioe72b54f2024-04-22 10:44:41 +0400203 infra := InfraConfig{
giodb274d12024-04-19 11:53:18 +0400204 Name: "dodo",
205 PublicIP: []net.IP{net.ParseIP("1.2.3.4")},
206 InfraNamespacePrefix: "id-",
207 InfraAdminPublicKey: []byte("foo"),
208 }
209 values := map[string]any{
210 "sshPrivateKey": "private",
211 }
giof8843412024-05-22 16:38:05 +0400212 rendered, err := a.Render(release, infra, values, nil)
giodb274d12024-04-19 11:53:18 +0400213 if err != nil {
214 t.Fatal(err)
215 }
216 for _, r := range rendered.Resources {
217 t.Log(string(r))
218 }
219}
220
221func TestPrivateNetwork(t *testing.T) {
222 r := NewInMemoryAppRepository(CreateAllApps())
223 a, err := FindEnvApp(r, "private-network")
224 if err != nil {
225 t.Fatal(err)
226 }
227 if a == nil {
228 t.Fatal("returned app is nil")
229 }
230 release := Release{
231 Namespace: "foo",
232 }
giodb274d12024-04-19 11:53:18 +0400233 values := map[string]any{
234 "privateNetwork": map[string]any{
235 "hostname": "foo",
236 "username": "bar",
237 "ipSubnet": "123123",
238 },
239 "sshPrivateKey": "private",
240 }
giocb34ad22024-07-11 08:01:13 +0400241 rendered, err := a.Render(release, env, networks, values, nil)
giodb274d12024-04-19 11:53:18 +0400242 if err != nil {
243 t.Fatal(err)
244 }
245 for _, r := range rendered.Resources {
246 t.Log(string(r))
247 }
248}
gio308105e2024-04-19 13:12:13 +0400249
250func TestAppPackages(t *testing.T) {
251 contents, err := valuesTmpls.ReadFile("values-tmpl/rpuppy.cue")
252 if err != nil {
253 t.Fatal(err)
254 }
255 app, err := NewCueEnvApp(CueAppData{
gioe72b54f2024-04-22 10:44:41 +0400256 "base.cue": []byte(cueBaseConfig),
257 "app.cue": []byte(contents),
258 "global.cue": []byte(cueEnvAppGlobal),
gio308105e2024-04-19 13:12:13 +0400259 })
260 if err != nil {
261 t.Fatal(err)
262 }
263 release := Release{
264 Namespace: "foo",
265 }
gio308105e2024-04-19 13:12:13 +0400266 values := map[string]any{
267 "network": "Public",
268 "subdomain": "woof",
269 "auth": map[string]any{
270 "enabled": true,
271 "groups": "a,b",
272 },
273 }
giocb34ad22024-07-11 08:01:13 +0400274 rendered, err := app.Render(release, env, networks, values, nil)
gio308105e2024-04-19 13:12:13 +0400275 if err != nil {
276 t.Fatal(err)
277 }
278 for _, r := range rendered.Resources {
279 t.Log(string(r))
280 }
281 for _, r := range rendered.Data {
282 t.Log(string(r))
283 }
284}
gioe72b54f2024-04-22 10:44:41 +0400285
286func TestDNSGateway(t *testing.T) {
287 contents, err := valuesTmpls.ReadFile("values-tmpl/dns-gateway.cue")
288 if err != nil {
289 t.Fatal(err)
290 }
291 app, err := NewCueInfraApp(CueAppData{
292 "base.cue": []byte(cueBaseConfig),
293 "app.cue": []byte(contents),
294 "global.cue": []byte(cueInfraAppGlobal),
295 })
296 if err != nil {
297 t.Fatal(err)
298 }
299 release := Release{
300 Namespace: "foo",
301 AppInstanceId: "dns-gateway",
302 RepoAddr: "ssh://192.168.100.210:22/config",
303 AppDir: "/infrastructure/gns-gateway",
304 }
305 infra := InfraConfig{
306 Name: "dodo",
307 PublicIP: []net.IP{net.ParseIP("135.181.48.180"), net.ParseIP("65.108.39.172")},
308 InfraNamespacePrefix: "dodo-",
309 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"),
310 }
311 values := map[string]any{
312 "servers": []EnvDNS{EnvDNS{"v1.dodo.cloud", "10.0.1.2"}},
313 }
giof8843412024-05-22 16:38:05 +0400314 rendered, err := app.Render(release, infra, values, nil)
gioe72b54f2024-04-22 10:44:41 +0400315 if err != nil {
316 t.Fatal(err)
317 }
318 for _, r := range rendered.Resources {
319 t.Log(string(r))
320 }
321 for _, r := range rendered.Data {
322 t.Log(string(r))
323 }
324}
gio0eaf2712024-04-14 13:08:46 +0400325
giof8843412024-05-22 16:38:05 +0400326//go:embed app_configs/testapp.cue
gio0eaf2712024-04-14 13:08:46 +0400327var testAppCue []byte
328
gio0eaf2712024-04-14 13:08:46 +0400329func TestPCloudApp(t *testing.T) {
gio1364e432024-06-29 11:39:18 +0400330 app, err := NewDodoApp(testAppCue)
331 if err != nil {
332 t.Fatal(err)
333 }
334 release := Release{
335 Namespace: "foo",
336 AppInstanceId: "foo-bar",
337 RepoAddr: "ssh://192.168.100.210:22/config",
338 AppDir: "/foo/bar",
339 }
giocb34ad22024-07-11 08:01:13 +0400340 _, err = app.Render(release, env, networks, map[string]any{
gioa60f0de2024-07-08 10:49:48 +0400341 "repoAddr": "",
342 "managerAddr": "",
343 "appId": "",
344 "sshPrivateKey": "",
gio1364e432024-06-29 11:39:18 +0400345 }, nil)
gio0eaf2712024-04-14 13:08:46 +0400346 if err != nil {
347 t.Fatal(err)
348 }
349}
gio266c04f2024-07-03 14:18:45 +0400350
351func TestDodoAppInstance(t *testing.T) {
352 r := NewInMemoryAppRepository(CreateAllApps())
353 a, err := FindEnvApp(r, "dodo-app-instance")
354 if err != nil {
355 t.Fatal(err)
356 }
357 if a == nil {
358 t.Fatal("returned app is nil")
359 }
360 release := Release{
361 Namespace: "foo",
362 }
363 values := map[string]any{
gio266c04f2024-07-03 14:18:45 +0400364 "repoAddr": "",
gio33059762024-07-05 13:19:07 +0400365 "repoHost": "",
gio266c04f2024-07-03 14:18:45 +0400366 "gitRepoPublicKey": "",
367 }
giocb34ad22024-07-11 08:01:13 +0400368 rendered, err := a.Render(release, env, networks, values, nil)
gio266c04f2024-07-03 14:18:45 +0400369 if err != nil {
370 t.Fatal(err)
371 }
372 for _, r := range rendered.Resources {
373 t.Log(string(r))
374 }
375}